Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

C++ का उपयोग करके किसी ऐरे में सभी तत्वों की रैंक

दी गई समस्या में, हमें एक सरणी के सभी दिए गए तत्वों को रैंक करने की आवश्यकता है, जिसमें सबसे छोटी संख्या सबसे छोटी रैंक और सबसे बड़ी रैंक सबसे बड़ी है। उदाहरण के लिए, हमें उनकी आवृत्तियों के आधार पर किसी संख्या के रैंक को बदलने की भी आवश्यकता होती है -

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, और अन्य भाषाओं में लिख सकते हैं।


  1. एक सरणी (सी ++) में सभी जोड़ीदार लगातार तत्वों का पूर्ण अंतर?

    इस समस्या में हम देखेंगे कि कैसे हम एक सरणी में तत्वों की प्रत्येक जोड़ी के तत्वों के बीच पूर्ण अंतर प्राप्त कर सकते हैं। यदि n तत्व हैं, तो परिणामी सरणी में n-1 तत्व होंगे। मान लीजिए कि तत्व {8, 5, 4, 3} हैं। परिणाम होगा |8-5| =3, तब |5-4| =1, |4-3|=1. एल्गोरिदम pairDiff(arr, n) begin    

  1. सी ++ प्रोग्राम हीप सॉर्ट एल्गोरिथम का उपयोग करके 10 तत्वों की एक सरणी को सॉर्ट करने के लिए

    हीप सॉर्ट बाइनरी हीप डेटा संरचना पर आधारित है। बाइनरी हीप में पैरेंट नोड के चाइल्ड नोड्स अधिकतम हीप के मामले में उससे छोटे या उसके बराबर होते हैं, और पैरेंट नोड के चाइल्ड नोड्स मिन हीप के मामले में उससे बड़े या उसके बराबर होते हैं। हीप सॉर्ट में सभी चरणों की व्याख्या करने वाला एक उदाहरण इस प्रकार ह

  1. सी ++ प्रोग्राम पॉइंटर का उपयोग करके एक ऐरे के तत्वों तक पहुंचने के लिए

    पॉइंटर्स मेमोरी लोकेशन या वेरिएबल्स के एड्रेस को स्टोर करते हैं। दूसरे शब्दों में, पॉइंटर्स एक मेमोरी लोकेशन को रेफर करते हैं और उस मेमोरी लोकेशन पर स्टोर किए गए वैल्यू को प्राप्त करना पॉइंटर को डीरेफ्रेंसिंग के रूप में जाना जाता है। एक प्रोग्राम जो किसी सरणी के एक तत्व तक पहुँचने के लिए पॉइंटर्स क