遇到乙個常見的分數排名問題,原題的要求是:
已知乙個分數陣列,陣列裡面是取值在0-100之間的分數,記為scorearray。要求輸出對應的排名陣列scorerankarray。解決方案1:使用比較法,判斷陣列中比自己分數大的分數的個數,若沒有比自己高的分數,排名即為1。所以初始化個數為1。比如:scorearray為[96,95,92,91,97,100,90,88,89,96];
對應應該輸出positionarray為:[3,5,6,7,2,1,8,10,9,3]
同樣分數的排名相同,但是後續的分數排名將累加。
演算法時間複雜度:o(n^2)
演算法空間複雜度:o(1)
對應下述的函式:
void getscorerank(int *scorearray,int len)
解決方案2:
1. 首先得到每個分數的人數,因為分數在0-100之間, 因此可以宣告乙個長度為101的陣列scorelibraryarray,陣列每個元素的值表示對應下標的分數的個數。比如scorelibraryarray[90]表示分數為90的人數。
2. 得到每個分數所在的排名,放在陣列scorefullarray中,scorefullarray[90]表示表示分數為90的排名
3.遍歷分數陣列scorearray,根據分數值和scorefullarray陣列中對應分數的排名,得到對應排名陣列相應位的排名值。
演算法時間複雜度:o(n)
演算法空間複雜度:o(1)
對應下述的函式:
void getscorerank_better(int *scorearray,int len);
使用c語言實現並測試乙個陣列的排名情況:
#include
#include
void getscorerank(int *scorearray,int len);
void getscorerank_better(int *scorearray,int len);
int main () ;
int *scorearray = scores;
static
int arraysize = 10;
getscorerank(scorearray,arraysize);
getscorerank_better(scorearray,arraysize);
return0;}
void getscorerank(int *scorearray,int len)
}*(scorerankarray+i) = scorerank;
}printf("score rank array is:\n[");
for (int i = 0;i < arraysize - 1;i++)
printf("%d]\n",*(scorerankarray + arraysize - 1));
free(scorerankarray);
scorerankarray = null;
}void getscorerank_better(int *scorearray,int len)
for (int i = 0;i <= scorerange;i++)
for (int i = 0;i < arraysize;i++)
int *scorefullarray = (int *)malloc(sizeof(int) * (scorerange+1));
for (int i = 0;i <= scorerange;i++)
int rank = 1;
for (int i = 99;i >= 0;i--)
*(scorefullarray + scorerange) = 1;
for (int j = 0;j < arraysize;j++)
printf("better solution: score rank array is:\n[");
for (int i = 0;i < arraysize - 1;i++)
printf("%d]\n",*(scorerankarray + arraysize - 1));
free(scorerankarray);
scorerankarray = null;
}
gcc編譯後輸出結果如下圖:
針對大量的資料排名,比如高考分數省級排名(百萬級別資料),使用優化後的演算法的時間效率提公升明顯。所以針對分數資料的排名,結合分數是有一定取值範圍,無須排序即可完成。與o(n) 時間的演算法進行員工年齡排序有異曲同工之妙。該題描述和分析如下:
> 題目:某公司有幾萬名員工,請完成乙個時間複雜度為o(n)的演算法對該公司員工的年齡作排序,可使用o(1)的輔助空間。
>
> 分析:排序是面試時經常被提及的一類題目,我們也熟悉其中很多種演算法,諸如插入排序、歸併排序、氣泡排序,快速排序等等。這些排序的演算法,要麼是o(n2)的,要麼是o(nlogn)的。可是這道題竟然要求是o(n)的,這裡面到底有什麼玄機呢?
> 題目特別強調是對乙個公司的員工的年齡作排序。員工的數目雖然有幾萬人,但這幾萬員工的年齡卻只有幾十種可能。上班早的人一般也要等到將近二十歲才上班,一般人再晚到了六七十歲也不得不退休。
動態記憶體分配需要呼叫free()釋放記憶體並重置為null,防止記憶體洩漏。
free(scorerankarray);
scorerankarray =null;
分數排名 mysql mysql的分數排名處理
問題 將資料庫score表排名 返回排名前10的 db有兩種方法 1 效率不高,因為有子查詢。但是簡潔。而且我對socres表做了index。所以效能上也差 不了多少。mysql show create table scores g 1.row table scores create table c...
mysql的分數排名處理
問題 將資料庫score表排名 返回排名前10的 db有兩種方法 1 效率不高,因為有子查詢。但是簡潔。而且我對socres表做了index。所以效能上也差 不了多少。mysql show create table scores g 1.row table scores create table c...
海量積分資料實時排名演算法
積分排名在很多專案都會出現,積分排名主要滿足以下需求 當排序的資料量不大的時候,這個需求很容易滿足,但是如果資料量很大的時候比如百萬級 千萬級甚至上億的時候,或者有實時排名需求 這個時候要滿足效能 低成本等需求,在設計上就變得複雜起來了。高效做法是不對積分進行排序,僅僅是統計每個積分區間的人數,用積...