दी गई समस्या में, हमें एक सरणी के सभी दिए गए तत्वों को रैंक करने की आवश्यकता है, जिसमें सबसे छोटी संख्या सबसे छोटी रैंक और सबसे बड़ी रैंक सबसे बड़ी है। उदाहरण के लिए, हमें उनकी आवृत्तियों के आधार पर किसी संख्या के रैंक को बदलने की भी आवश्यकता होती है -
Input : 20 30 10 Output : 2.0 3.0 1.0 Input : 10 12 15 12 10 25 12 Output : 1.5, 4.0, 6.0, 4.0, 1.5, 7.0, 4.0 Here the rank of 10 is 1.5 because there are two 10s present in the given array now if we assume they both take different ranks i.e. 1 and 2 and we thus divide it within themselves so their rank becomes 1.5 and 1.5. Input : 1, 2, 5, 2, 1, 60, 3 Output : 1.5, 3.5, 6.0, 3.5, 1.5, 7.0, 5.0
समाधान खोजने के लिए दृष्टिकोण
समाधान खोजने के लिए दो अलग-अलग दृष्टिकोण हैं, और वे हैं -
क्रूर फ़ोर्स अप्रोच
इस दृष्टिकोण में, हम लूप करेंगे, किसी विशेष तत्व का चयन करेंगे, और उसकी रैंक निर्धारित करेंगे।
उदाहरण
#include <bits/stdc++.h>
using namespace std;
int main() {
int arr[] = {1, 2, 5, 2, 1, 25, 2}; // given array
int n = sizeof(arr) / sizeof(arr[0]); // size of our given array
float rank[n] = {0}; // our ranking array
for (int i = 0; i < n; i++) {
int r = 1; // the number of elements greater than arr[i]
int s = 1; // the number of elements equal to arr[i]
for (int j = 0; j < n; j++) {
if (j != i && arr[j] < arr[i])
r += 1;
if (j != i && arr[j] == arr[i])
s += 1;
}
rank[i] = r + (float)(s - 1) / (float) 2; // using formula
//to obtain rank of particular element
}
for (int i = 0; i < n; i++) // outputting the ranks
cout << rank[i] << ' ';
return 0;
} आउटपुट
1.5 4 6 4 1.5 7 4
इस कार्यक्रम की समय जटिलता O(N*N) . है जहाँ N अब किसी दिए गए सरणी का आकार है; जैसा कि आप देख सकते हैं, हमारी समय जटिलता अच्छी नहीं है, इसलिए हम उच्च बाधाओं के लिए अच्छी तरह से काम करने के लिए इसकी दक्षता बढ़ाएंगे।
कुशल दृष्टिकोण
इस दृष्टिकोण में, हम एक नया एरे लेने जा रहे हैं और इसे अभी सॉर्ट करेंगे क्योंकि एरे को सॉर्ट किया गया है अब हम जानते हैं कि एक ही रैंक के सभी तत्व एक साथ होंगे, इसलिए अब हम उन्हें हमेशा की तरह रैंक करते हैं और फिर रैंक की गणना करते हैं। विशेष तत्व।
उदाहरण
#include <bits/stdc++.h>
using namespace std;
int main() {
int arr[] = {1, 2, 5, 2, 1, 60, 3}; // given array
int n = sizeof(arr) / sizeof(arr[0]); // size of our given array
float rank[n] = {0}; // our ranking array
int old[n];
for(int i = 0; i < n; i++)
old[i] = arr[i];
sort(arr, arr+n); // sorting the array
int prev = arr[0];
int r = 1; // ranks
int s = 0; // frequency
int tot = 0; // will stack up all the rank contained by an element
map<int, float> rrank;
for (int i = 0; i < n; i++) {
if(prev == arr[i]) {
s++;
tot += r;
} else {
float now = 0;
now = (float)tot/s; // dividing the ranks equally
rrank[prev] = now;
prev = arr[i];
tot = r;
s = 1;
}
r++;
}
rrank[arr[n-1]] = (float)tot/s;
for (int i = 0; i < n; i++) // outputting the ranks
cout << rrank[old[i]] << " ";
return 0;
} आउटपुट
1.5 3.5 6 3.5 1.5 7 5
उपरोक्त कोड की व्याख्या
इस दृष्टिकोण में, हम अपने सरणी को क्रमबद्ध करते हैं, और फिर हम प्रत्येक तत्व को प्रारंभ से रैंक करते हैं (1 से शुरू होने वाली रैंक)। अब, यदि हमारा पिछला तत्व हमारे वर्तमान तत्व के बराबर है, तो हम s बढ़ाते हैं और अपने रैंकों के योग तक ढेर करते हैं। जब हमारे तत्वों को बदल दिया जाता है, तो हम रैंक को पिछले तत्वों में विभाजित करते हैं, s और कुल को ताज़ा करते हैं, और अपना कोड जारी रखते हैं।
निष्कर्ष
इस लेख में, हम एक सरणी में सभी तत्वों की रैंक खोजने के लिए एक समस्या का समाधान करते हैं। हमने इस समस्या के लिए C++ प्रोग्राम और संपूर्ण दृष्टिकोण (सामान्य और कुशल) भी सीखा जिसके द्वारा हमने इस समस्या को हल किया। हम उसी प्रोग्राम को अन्य भाषाओं जैसे C, java, python, और अन्य भाषाओं में लिख सकते हैं।