打撲克和插入排序

2021-06-28 21:57:43 字數 979 閱讀 1575

我們在打撲克的時候有兩種策略,一種是一邊抓牌一邊排序,比如:抓到2,再抓到5就排在2的左邊,又轉到3就放到中間,如此遞迴,牌抓好了也排序好了,「似乎」很快。原因就是,在其他小夥伴抓牌的時候,你在排序,屬於平行計算,可不是你的排序演算法比較優秀,不過這種排序也是o(n)的時間複雜度,效率還是很高的。

而另一種策略就是大家先不排序,幾個小夥伴拼命抓牌,每個人都抓好牌之後,大家集中「擺牌」,其實我小時候玩牌就是這種方法,而計算機的排序問題基本都是這種情況。你只有兩隻手,不能增加多乙個手幫你,儲存空間一定,那麼你就排序吧。基本策略就是:從第二張開始看是否比第一張大,如果大就放到左邊;然後看第三張,從最右邊開始比較,如果比他小就放到他右邊,否則就一路向上直到最左,所以這種複雜度是o(n*n)。經過我的實踐證明,人家打出牌了之後,我還沒有排序完成,這種方法真的很耗時,而這種方法就叫「插入排序」,其實我們每個人都會,好深奧的感覺似的。

上面是玩鬥地主的排序,如果你玩公升級就有新的玩法,把4種花色分組,然後再排序,如果還是先抓牌,再排序這樣做,你就會發現,你的速度有明顯提高,而這種「分治思想」就是演算法的優化,把大問題轉化成小問題,這種每個小問題都容易解決,整體就加速解決了。快速排序就是這個思路,不過我們玩公升級採用的叫「桶式排序」,在上百萬資料以上的大資料方面,比其他方式都快,當然是「讓無序資料變有序」,而不是「在有序資料裡面找資料」。

但是無論那種排序,先抓牌後排序的總是沒有一邊抓牌一邊排序,插入過程就是排序過程,這樣來得快。這種方法就是「b樹」的儲存結構,時間複雜度是o(log(n)),你有乙個2到k的同花順,然後你抓到了10,這時候你應該不會從2數到10這樣,扇形握牌第一眼你會看到中間的8,然後從這裡向左移動兩位就是10了,插入進去再抓牌。這樣你無形之中就少數了一半的牌,這樣複雜度就從線性的o(n),變成對數曲線的o(log(n))。當然如果你是天才,能有3隻手,把撲克牌分成3個區間,比如:1-5,2-10,j-k,抓牌時候你直接到對應的手裡面去插入,多塊啊,這就變成了「b-樹」了。所謂的優化,也不過就是這樣簡單思路的擴充套件而已,其實我們每個人都會,只不過你不拿來寫**騙經費罷了,呵呵。

CSP校內集訓 打撲克

有 n 堆大小為1的撲克,支援合併兩堆撲克和查詢有多少對撲克堆滿足 size i size j leq c c 不確定 暴力做法 開桶記錄當前存在有多少個大小為 i 的堆,查詢可用樹狀陣列或者雙指標,時間複雜度 o m 2logn 或者 o m 2 優化 發現列舉大小的桶有很多是空的,實際上,可以證...

使用打撲克的方式進行專案評估

專案經理準備乙個user story,每個人使用撲克的表達對於這個任務的預估。比如如果是10天,就蓋住乙個撲克牌10,不讓其它人看到。等大家都打出牌後,一起開牌。預期相差大的人互相闡述自己的考慮。再進行一輪,直到時間相差不大為止。討論完user story後,確定這個user story的實現和分工...

Python破解24點遊戲,從此打撲克就沒輸過

24點遊戲 對於任意給定的四張撲克牌,計算是否有贏得24點遊戲的方法 即使用加 減 乘 除四則運算湊成24的方法 如果有的話,列出所有可能的方法。在大小王以外的52張牌中,任意抽取其中4張牌。如果通過加 減 乘 除四則運算 可加括號 的方法,將抽到的4張牌算成24,則為勝利 每張牌都必須使用,且只能...