1. 程式人生 > >洗牌演算法具體指的是什麼

洗牌演算法具體指的是什麼

這裡是修真院前端小課堂,每篇分享文從

【背景介紹】【知識剖析】【常見問題】【解決方案】【編碼實戰】【擴充套件思考】【更多討論】【參考文獻】

八個方面深度解析前端知識/技能,本篇分享的是:

【洗牌演算法具體指的是什麼】

標題:

【修真院web小課堂】洗牌演算法具體指的是什麼

開場語:

大家好,我是IT修真院北京分院第36期的學員張新,一枚正直純潔善良的web程式設計師,今天給大家分享一下,修真院官網js(職業)任務2,深度思考中的知識點——洗牌演算法具體指的是什麼

(1)背景介紹:


洗牌演算法顧名思義就是,它的產生就是用來解決洗牌場合的問題,目的是產生一系列等概率的隨機數,使得很難去預測牌的順序,洗牌演算法是我們常見的隨即問題,同時也是一道經典的面試題。

(2)知識剖析:

何為洗牌演算法:一個1到n的序列隨機打亂,保證每一個數出現大的概率相同。

(3)常見問題:

有哪些實現洗牌的演算法?

(4)解決方案:

假如你要洗牌,那麼最隨機的做法無疑是從牌堆裡隨便抽一張出來,然後放在一邊,之後從剩下的牌裡重複之前的操作,直到所有牌都被抽出來放到了另一堆中。抽象到程式碼世界,按相同的做法,就是隨機從數組裡取出一個元素,儲存到另一個數組,然後重複之,直到原陣列中所有元素都處理掉。

(5)編碼實戰:

                function shuffle(array) {

                 var copy = [], n = array.length, i;

               // 如果還有剩餘元素則繼續

               while (n) {

               // 隨機取一個元素

               i = Math.floor(Math.random() * array.length);

                // 如果這個元素之前沒有被選中過

               if (i in array) {

               copy.push(array[i]);

                delete array[i];

               n--;

               }

             }

                return copy;

             }

            

(6)拓展思考:

除了洗牌演算法還有哪些經典的演算法。

氣泡排序,快速排序,插入排序,二分查詢,選擇排序,希爾排序,歸併排序,堆排序,基數排序。

(7)參考文獻:

<a href="http://www.cnblogs.com/Wayou/p/fisher_yates_shuffle.html" target="_blank">由亂序播放說開了去-陣列的打亂演算法Fisher–Yates Shuffle</a>

<a href="https://github.com/julycoding/The-Art-Of-Programming-By-July/blob/master/ebook/zh/02.09.md" target="_blank">UC面試題-完美洗牌演算法</a>

(8)更多討論:

Q1:提問人:1.什麼是好的洗牌演算法?

A1:回答人(張新): 洗牌之後,如果能夠保證每一個數出現在所有位置上的概率是相等的,那麼這種演算法是符合要求的;這在個前提下,儘量降低時間和空間複雜度。

        


Q2:提問人:2,洗牌中抽牌法指的是什麼?

A2:回答人(張新):

                //每次抽出一張牌,放在另一堆。把最後一張未抽的牌放在空位子上。

                function shuffle_pick_1(m) //洗牌 //抽牌法

                {

                //生成m張牌

                var arr = new Array(m);

                for (var i=0; i

                arr[i] = i;

                }

                //每次抽出一張牌,放在另一堆。因為要在數組裡抽出元素,把後面的所有元素向前拉一位,所以很耗時。

                var arr2 = new Array();

                for (var i=m; i&gt;0; i--) {

                var rnd = Math.floor(Math.random()*i);

                arr2.push(arr[rnd]);

                arr.splice(rnd,1);

                }

                return arr2;

                }

            


Q3:提問人:洗牌中換牌髮指的是什麼?
A3:回答人(張新):

               //第i張與任意一張牌換位子,換完一輪即可。

                function shuffle_swap(m) //洗牌 //換牌法

                {

                //生成m張牌

                var arr = new Array(m);

                for (var i=0; i

                arr[i] = i;

                }

                //第i張與任意一張牌換位子,換完一輪即可

                for (var i=0; i

                var rnd = Math.floor(Math.random()*(i+1)),

                temp = arr[rnd];

                arr[rnd] = arr[i];

                arr[i]=temp;

                }

                return arr;

                }

            

(9)鳴謝:

感謝劉仁瑞、郭晨陽師兄,此教程是在他們之前技術分享的基礎上完善而成。

(10)結束語:

今天的分享就到這裡啦,歡迎大家點贊、轉發、留言、拍磚~

 

 

PPT連結 視訊連結

更多內容,可以加入IT交流群565734203與大家一起討論交流

這裡是技能樹·IT修真院:https://www.jnshu.com,初學者轉行到網際網路的聚集地