तत्वों और उनकी गणनाओं को संग्रहित करने के लिए आकार (के -1) का एक अस्थायी सरणी बनाएं (आउटपुट तत्व इन के -1 तत्वों में से एक होने जा रहे हैं)।
इनपुट सरणी और के माध्यम से पार अद्यतन अस्थायी [] (जोड़ें/एक तत्व या वृद्धि/कमी गिनती निकालने के लिए) हर चल तत्व के लिए। सरणी temp [] हर कदम पर संभावित (के -1) उम्मीदवारों को स्टोर करता है। यह कदम ओ (एनके) समय लेता है।
- अंतिम (K-1) संभावित उम्मीदवारों के माध्यम से दोहराएं (अस्थायी में [] संग्रहीत)। या प्रत्येक तत्व, जांचें कि वास्तव में यह एन/के से अधिक गिनती है या नहीं। यह कदम ओ (एनके) समय लेता है।
मुख्य चरण चरण 2 है, हर बिंदु पर संभावित उम्मीदवारों को कैसे बनाए रखा जाए? चरण 2 में उपयोग किए गए कदम मशहूर गेम की तरह हैं: टेट्रिस। हम टेट्रिस में एक टुकड़े के रूप में प्रत्येक नंबर का इलाज करते हैं, जो हमारे अस्थायी सरणी temp [] में गिर जाता है। हमारा कार्य एक ही कॉलम पर एक ही संख्या को रखने की कोशिश करना है (अस्थायी सरणी में गिनती बढ़ी है)।
Consider k = 4, n = 9
Given array: 3 1 2 2 2 1 4 3 3
i = 0
3 _ _
temp[] has one element, 3 with count 1
i = 1
3 1 _
temp[] has two elements, 3 and 1 with
counts 1 and 1 respectively
i = 2
3 1 2
temp[] has three elements, 3, 1 and 2 with
counts as 1, 1 and 1 respectively.
i = 3
- - 2
3 1 2
temp[] has three elements, 3, 1 and 2 with
counts as 1, 1 and 2 respectively.
i = 4
- - 2
- - 2
3 1 2
temp[] has three elements, 3, 1 and 2 with
counts as 1, 1 and 3 respectively.
i = 5
- - 2
- 1 2
3 1 2
temp[] has three elements, 3, 1 and 2 with
counts as 1, 2 and 3 respectively.
Now the question arises, what to do when temp[] is full and we see a new element – we remove the bottom row from stacks of elements, i.e., we decrease count of every element by 1 in temp[]. We ignore the current element.
i = 6
- - 2
- 1 2
temp[] has two elements, 1 and 2 with
counts as 1 and 2 respectively.
i = 7
- 2
3 1 2
temp[] has three elements, 3, 1 and 2 with
counts as 1, 1 and 2 respectively.
i = 8
3 - 2
3 1 2
temp[] has three elements, 3, 1 and 2 with
counts as 2, 1 and 2 respectively.
अंत में, हमारे पास temp [] में अधिकांश के -1 नंबर हैं। अस्थायी तत्व {3, 1, 2} हैं। ध्यान दें कि temp [] में गणना अब बेकार हैं, गणना केवल चरण 2 में आवश्यक थी। अब हमें यह जांचने की आवश्यकता है कि temp [] में तत्वों की वास्तविक गणना n/k (9/4) से अधिक है या नहीं। तत्व 3 और 2 की संख्या 9/4 से अधिक है। तो हम प्रिंट 3 और 2
ध्यान दें कि एल्गोरिथ्म किसी भी उत्पादन तत्व याद नहीं करता है। दो संभावनाएं हो सकती हैं, कई घटनाएं एक साथ हैं या सरणी में फैली हुई हैं। यदि घटनाएं एक साथ हैं, तो गिनती अधिक होगी और 0 नहीं बन जाएगी। अगर घटनाएं फैलती हैं, तो तत्व अस्थायी रूप से फिर से आ जाएगा []। उपरोक्त एल्गोरिदम के सी ++ कार्यान्वयन के बाद निम्नलिखित है।
// A C++ program to print elements with count more than n/k
#include<iostream>
using namespace std;
// A structure to store an element and its current count
struct eleCount
{
int e; // Element
int c; // Count
};
// Prints elements with more than n/k occurrences in arr[] of
// size n. If there are no such elements, then it prints nothing.
void moreThanNdK(int arr[], int n, int k)
{
// k must be greater than 1 to get some output
if (k < 2)
return;
/* Step 1: Create a temporary array (contains element
and count) of size k-1. Initialize count of all
elements as 0 */
struct eleCount temp[k-1];
for (int i=0; i<k-1; i++)
temp[i].c = 0;
/* Step 2: Process all elements of input array */
for (int i = 0; i < n; i++)
{
int j;
/* If arr[i] is already present in
the element count array, then increment its count */
for (j=0; j<k-1; j++)
{
if (temp[j].e == arr[i])
{
temp[j].c += 1;
break;
}
}
/* If arr[i] is not present in temp[] */
if (j == k-1)
{
int l;
/* If there is position available in temp[], then place
arr[i] in the first available position and set count as 1*/
for (l=0; l<k-1; l++)
{
if (temp[l].c == 0)
{
temp[l].e = arr[i];
temp[l].c = 1;
break;
}
}
/* If all the position in the temp[] are filled, then
decrease count of every element by 1 */
if (l == k-1)
for (l=0; l<k; l++)
temp[l].c -= 1;
}
}
/*Step 3: Check actual counts of potential candidates in temp[]*/
for (int i=0; i<k-1; i++)
{
// Calculate actual count of elements
int ac = 0; // actual count
for (int j=0; j<n; j++)
if (arr[j] == temp[i].e)
ac++;
// If actual count is more than n/k, then print it
if (ac > n/k)
cout << "Number:" << temp[i].e
<< " Count:" << ac << endl;
}
}
/* Driver program to test above function */
int main()
{
cout << "First Test\n";
int arr1[] = {4, 5, 6, 7, 8, 4, 4};
int size = sizeof(arr1)/sizeof(arr1[0]);
int k = 3;
moreThanNdK(arr1, size, k);
cout << "\nSecond Test\n";
int arr2[] = {4, 2, 2, 7};
size = sizeof(arr2)/sizeof(arr2[0]);
k = 3;
moreThanNdK(arr2, size, k);
cout << "\nThird Test\n";
int arr3[] = {2, 7, 2};
size = sizeof(arr3)/sizeof(arr3[0]);
k = 2;
moreThanNdK(arr3, size, k);
cout << "\nFourth Test\n";
int arr4[] = {2, 3, 3, 2};
size = sizeof(arr4)/sizeof(arr4[0]);
k = 3;
moreThanNdK(arr4, size, k);
return 0;
}
तो आपने क्या प्रयास किया है और आपको विशेष रूप से किस समस्या का सामना करना पड़ रहा है? –
यहां अंग्रेजी का अच्छा उपयोग। –
"खुद को दोहराएं", क्या आपका मतलब है कि यह एक ही संख्या का लगातार रन होना चाहिए? –