O n 時間的演算法進行分數排名

2021-07-29 08:45:02 字數 2993 閱讀 5460

遇到乙個常見的分數排名問題,原題的要求是:

已知乙個分數陣列,陣列裡面是取值在0-100之間的分數,記為scorearray。要求輸出對應的排名陣列scorerankarray。

比如:scorearray為[96,95,92,91,97,100,90,88,89,96];

對應應該輸出positionarray為:[3,5,6,7,2,1,8,10,9,3]

同樣分數的排名相同,但是後續的分數排名將累加。

解決方案1:使用比較法,判斷陣列中比自己分數大的分數的個數,若沒有比自己高的分數,排名即為1。所以初始化個數為1。

演算法時間複雜度: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...

海量積分資料實時排名演算法

積分排名在很多專案都會出現,積分排名主要滿足以下需求 當排序的資料量不大的時候,這個需求很容易滿足,但是如果資料量很大的時候比如百萬級 千萬級甚至上億的時候,或者有實時排名需求 這個時候要滿足效能 低成本等需求,在設計上就變得複雜起來了。高效做法是不對積分進行排序,僅僅是統計每個積分區間的人數,用積...