প্রদত্ত সমস্যাটিতে, আমাদের একটি অ্যারের সমস্ত প্রদত্ত উপাদানগুলিকে র্যাঙ্ক করতে হবে, যার মধ্যে সবচেয়ে ছোট সংখ্যাটির সবচেয়ে ছোট র্যাঙ্ক রয়েছে এবং সবচেয়ে বড়টির সবচেয়ে বড় র্যাঙ্ক রয়েছে। আমাদের একটি সংখ্যার রেঙ্কগুলি তাদের ফ্রিকোয়েন্সির উপর নির্ভর করে পরিবর্তন করতে হবে, উদাহরণের জন্য −
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++ প্রোগ্রাম এবং সম্পূর্ণ পদ্ধতি ( স্বাভাবিক এবং দক্ষ) শিখেছি যার মাধ্যমে আমরা এই সমস্যার সমাধান করেছি। আমরা অন্যান্য ভাষায় যেমন সি, জাভা, পাইথন এবং অন্যান্য ভাষায় একই প্রোগ্রাম লিখতে পারি।