2015-11-02 97 views
-1

我在C從陣列計數數量的頻率下面的代碼:頻率計是這段代碼的有效和高效的

#define MAX 10 
int flag=0; 

void display(int no,int cnt,int visi[]);//function declaration 

int main() 
{ 
    int arr[]={1,1,1,2,3,4,2,2,3,1};//asume any array or we can enter from user 
    int visited[MAX]; 
    int i,j,no,cnt=1; 
    clrscr(); 
    for(i=0;i<10;i++)//loop 
    { 
     no=arr[i]; 
     cnt=1; 
     for(j=i+1;j<10;j++) 
     { 
      if(no==arr[j]) 
       cnt++; 
     } 
     display(no,cnt,visited); 
    } 
    return 0; 
} 

void display(int no,int cnt,int visited[]) 
{ 
    int static i; 
    int j; 

    if(flag==1) 
    for(j=0;j<=i;j++) 
    { 
     if(visited[j]==no) 
     goto a; 
    } 
    i++; 
    flag=1; 
    printf("\n%d=%d",no,cnt); 
    visited[i]=no; 
    a: 
} 

請幫助改善我的代碼或建議其他任何技術的有效性 這個算法是否有效且效率還是不高,請給予反饋。

+0

函數結束處的標籤是編譯時錯誤。 ''void main()'應該是'int main(void)' – mch

+0

A.一些Cr問題(定義'MAX'然後使用'10' - 爲什麼?)B.你正在做'O(n^2)' - 這是你能做的最糟糕的事情(雖然有時候這是必要的)。 –

+0

你對陣列中的數字範圍事先知道嗎?知道這可以顯着提高你的效率(再次,只是有時) –

回答

0

你不明確地這樣說,但它看起來好像你有一個非負數的數組,但值小於MAX

如果數字的範圍是已知的,您可以創建一個計數數組。訪問數組中的每個元素並增加該元素的計數。然後通過計數數組並適當輸出。

如果有效數字的範圍以及因此count數組的大小很小,此方法運行良好。 (您的visited陣列的同樣問題,其大小與計數陣列的大小相同。)

下面的示例使用計數數組實現計數。該代碼還可以處理包含在MINMAX之間的有效範圍之外的值。

#include <stdio.h> 

#define MIN 1 
#define MAX 10 

int main() 
{ 
    int arr[] = {1, 1, 1, 2, 3, 4, 2, 2, 3}; 
    int narr = sizeof(arr)/sizeof(arr[0]); 

    int count[MAX + 1 - MIN] = {0}; 
    int uncounted = 0; 
    int i; 

    for(i = 0; i < narr; i++) { 
     if (arr[i] < MIN || arr[i] > MAX) { 
      uncounted++; 
     } else { 
      count[arr[i] - MIN]++; 
     } 
    } 

    for(i = MIN; i < MAX + 1; i++) { 
     if (count[i - MIN]) { 
      printf("element %d ocurs %d times.\n", i, count[i - MIN]); 
     } 
    } 

    if (uncounted) { 
     printf("%d elements were not accounted for.\n", uncounted); 
    } 

    return 0; 
} 
0
int main() 

實現有關。你不想使用這個,一些編譯器不會接受它。

使用

int main(void) 

代替

for(i=0;i<10;i++)//loop 

您已經定義MAX,那麼爲什麼不有使用它。像這樣的東西使代碼難以維護。

效率取決於您擁有的輸入值。對於小號碼的小陣列,其他情況下可以正常工作。

+0

謝謝你的建議我這麼着急,而做這個程序,我忘了MAX,但現在我明白了我的錯誤... – SylvesterTheKid

2

計數數的頻率在陣列中,嘗試這個代碼

#include <stdio.h> 
#define MAX 10 

int countArray[MAX]; 

int main() 
{ 
    int arr[]={1,1,1,2,3,4,2,2,3,1},i; 
    for(i=0;i<MAX;i++) 
     countArray[i]=0; 
    for(i=0;i<MAX;i++) 
     countArray[arr[i]]++; 
    for(i=0;i<MAX;i++) 
    { 
     if(countArray[i]) 
      printf("%d %d\n",i,countArray[i]); 
    } 

    return 0; 
} 
+0

這個解決方案的問題是數組中的值可以是任何值。 'countArray [1000]'會給你一些有趣的時間... –

+0

現在檢查。 @shapiroyaacov。謝謝 –

+0

'countArray'的大小爲10.如果'arr'爲'{100,123,135}'當您嘗試'countArray [arr [i]] ++時,您會發生什麼事情;'? –

2

可以將陣列首先通過合併排序(O(n log n))進行排序,然後通過像這 - 單迴路計算一個數的頻率:

int j=0;  
for(i = 0; i < 9; i++) 
{  
    if (arr[i] == arr[i+1]) 
     cnt++; 
    else 
    { 
     visited[j] = cnt; 
     cnt = 0; 
     j++; 
    }   
}