洗牌演算法具體指的是什麼
這裡是修真院前端小課堂,每篇分享文從
【背景介紹】【知識剖析】【常見問題】【解決方案】【編碼實戰】【擴充套件思考】【更多討論】【參考文獻】
八個方面深度解析前端知識/技能,本篇分享的是:
【洗牌演算法具體指的是什麼】
標題:
【修真院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>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)結束語:
今天的分享就到這裡啦,歡迎大家點贊、轉發、留言、拍磚~
更多內容,可以加入IT交流群565734203與大家一起討論交流
這裡是技能樹·IT修真院:https://www.jnshu.com,初學者轉行到網際網路的聚集地