大家好,我是IT修真院深圳分院第02期學員,一枚正直善良的web程序員。
今天給大家分享一下,修真院官網JS任務02,深度思考中的知識點——洗牌算法具體指的是什么?
1.背景介紹
洗牌算法,顧名思義,它的產生是用來解決類似洗牌這種場景的問題的,目的是產生一串等概率的隨機列,使得很難去預測牌的順序,洗牌算法是我們常見的隨機問題,在玩游戲,隨機排序時經常用到。同時它也是一道經典的面試題。
2.知識剖析
何為洗牌算法?
一個1到n的序列,隨機打亂,保證每個數出現在任意一個位置的概率相同。
3.常見問題
有哪些實現洗牌的算法?
4.解決方案
Fisher-Yates Shuffle ??鏈接
一般化方法
假如要洗牌,那么最隨機的做法無疑是從牌堆里隨便抽一張出來,然后放在一邊,之后從剩下的牌里重復之前的操作,直到所有牌都被抽出來放到了另一堆中。抽象到代碼世界,按相同的做法,就是隨機從數組里取出一個元素,保存到另一個數組,然后重復之,直到原數組中所有元素都處理掉。
缺點:即使一個序號上的元素已經被處理過了,由于隨機函數產生的數是隨機的,所有這個被處理過的元素序號可能在之后的循環中不斷出現。
改進方法
處理完一個元素后,我們用Array的splice()方法將其從目標數組中移除同時也更新了目標數組的長度,如此一來下次遍歷的時候是從新的長度開始,不會重復處理的情況了。
缺點:因為調用splice來刪除數組元素會導致刪除位置之后的所有元素要做shift操作來向前補充,從而達到將數組長度減小的目的,當然這是在后臺自動完成的,但這無疑增加了算法的復雜度。
算法能否再次優化?
考慮不創建新的數組來保存已經抽取的元素:隨機從數組中抽出一個元素,然后與最后個元素交換,相當于把這個隨機抽取的元素放到了數組最后面去,表示它已經是被隨機過了,同時被換走的那個元素跑到前面去了,會在后續的重復操作中被隨機掉。一輪操作過后,下一輪我們只在剩下的n-1個元素也就是數組的前n-1個元素中進行相同的操作,直到進行到第一個。
5.編碼實戰
6.擴展思考
除了洗牌算法,還有哪些經典的排序算法?
7.參考文獻
參考一:由亂序播放說開了去-數組的打亂算法Fisher–Yates Shuffle
參考二:UC面試題-完美洗牌算法
8.更多討論
還有沒有更簡單的洗牌算法?
9.視頻資料
今天的分享就到這里啦,歡迎大家點贊、轉發、留言、拍磚~
下期不見不散~