關於排名演算法的隨想

2021-10-21 05:04:25 字數 641 閱讀 1484

問題:有n個玩家的分數,要對前k個最高分玩家進行排名。

用乙個最大堆排序就能解決。根據演算法導論:

maxheapify(heap, i)中heap[i]的左右節點都是最大堆,函式作用是對下標為i的節點進行堆形態的維護。時間複雜度為o(lgn)

buildmaxheap(heap)中是對乙個無序陣列進行最大堆化。時間複雜度為o(n)

heapsort(heap, k)定義為對陣列進行堆排序,找出最大的k個數。

所以,第一次找出k個最高分玩家,時間複雜度為o(klgn)。

更新策略:

1.如果變化的是k名之外,則倒序對比前k個分數,插入合適位置即可。

2.如果變化的是k名之內,正序對比前k個分數,若能在k個之內找到合適位置,只需插入操作,若排名在k之外,則說明要在剩下的分數中選出最大的,呼叫一次buildmaxheap(heap)即可,複雜度為o(n)

還可以從設計角度進行優化,根據經驗,因為遊戲前k個排名浮動範圍一般都不會超過一定範圍,比如1.5k。意思是,競爭前k個排名的玩家一般都是前1.5k左右的玩家,太靠後玩家一般沒有衝榜意願。所以進行堆排序時,可以直接選出前1.5k玩家,這樣更新策略中第二種情況使用buildmaxheap(heap)函式的情況可能變為順序向後對比即可。

跳表(skiplist), 紅黑樹

關於圈子的隨想

昨天人資的老大找我們部門的人挨個談話,其中和我聊的時候問了乙個問題 你覺得到現在這家公司來,是選對了,還是選錯了呢?當時我不加思索地回答道 當然是選對了。今天早上,又在裡面看到一篇關於程式設計師的圈子的文章 程式設計師你的圈子有多大呢?忽然明白,其實之所以當時那麼肯定地給了回答,正是因為我來到這家公...

關於圈子的隨想

昨天人資的老大找我們部門的人挨個談話,其中和我聊的時候問了乙個問題 你覺得到現在這家公司來,是選對了,還是選錯了呢?當時我不加思索地回答道 當然是選對了。今天早上,又在裡面看到一篇關於程式設計師的圈子的文章 程式設計師你的圈子有多大呢?忽然明白,其實之所以當時那麼肯定地給了回答,正是因為我來到這家公...

關於圈子的隨想

昨天人資的老大找我們部門的人挨個談話,其中和我聊的時候問了乙個問題 你覺得到現在這家公司來,是選對了,還是選錯了呢?當時我不加思索地回答道 當然是選對了。今天早上,又在裡面看到一篇關於程式設計師的圈子的文章 程式設計師你的圈子有多大呢?忽然明白,其實之所以當時那麼肯定地給了回答,正是因為我來到這家公...