洗牌演算法具體指的是什麼?
阿新 • • 發佈:2019-02-04
1.背景介紹
洗牌演算法是我們常見的隨機問題,在玩遊戲、隨機排序時經常會碰到,本質是讓一個數組內的元素隨機排列。
2.知識剖析
洗牌演算法是一種隨機排序的演算法,其排序思想是:首先生成一個有序的陣列,然後從陣列中隨機抽取兩個元素交換位置,重複這個過程若干次,就變成了一個隨機的陣列。
如何實現一個簡單的洗牌演算法?
var oneArray = [1,2,3,4,5,6,7,8];
console.log(oneArray);
Array.prototype.shuffle = function () {
var a = oneArray;
for(var i = a.length - 1;i >= 0; i--){
var randomIndex = Math.floor(Math.random()*(i + 1));
var itemAtIndex = a[randomIndex];
a[randomIndex] = a[i];
a[i] = itemAtIndex;
}
return a;
};
console.log(oneArray.shuffle());
3.常見問題
4.解決方案
5.編碼實戰
6.擴充套件思考
主要程式碼
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; }
演示二
主要程式碼
function shuffle(array) { var copy = [], n = array.length, i; while (n) { i = Math.floor(Math.random() * n--); copy.push(array.splice(i, 1)[0]); } return copy; } 演示三 主要程式碼 function shuffle(array) { var m = array.length, t, i; while (m) { i = Math.floor(Math.random() * m--); t = array[m]; array[m] = array[i]; array[i] = t; } return array; }7.參考文獻一、javascript隨機之洗牌演算法深入分析二、【演算法詳解】洗牌演算法三、陣列的完全隨機排列四、由亂序播放說開了去-陣列的打亂演算法
洗牌演算法是我們常見的隨機問題,在玩遊戲、隨機排序時經常會碰到,本質是讓一個數組內的元素隨機排列。
2.知識剖析
洗牌演算法是一種隨機排序的演算法,其排序思想是:首先生成一個有序的陣列,然後從陣列中隨機抽取兩個元素交換位置,重複這個過程若干次,就變成了一個隨機的陣列。
如何實現一個簡單的洗牌演算法?
var oneArray = [1,2,3,4,5,6,7,8];
console.log(oneArray);
Array.prototype.shuffle = function () {
var a = oneArray;
for(var i = a.length - 1;i >= 0; i--){
var randomIndex = Math.floor(Math.random()*(i + 1));
var itemAtIndex = a[randomIndex];
a[randomIndex] = a[i];
a[i] = itemAtIndex;
}
return a;
};
console.log(oneArray.shuffle());
3.常見問題
4.解決方案
5.編碼實戰
6.擴充套件思考
有複雜的洗牌演算法嗎?有
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; }
主要程式碼
function shuffle(array) { var copy = [], n = array.length, i; while (n) { i = Math.floor(Math.random() * n--); copy.push(array.splice(i, 1)[0]); } return copy; }
8.更多討論
問題一:什麼是好的洗牌演算法?
答:
洗牌之後,如果能夠保證每一個數出現在所有位置上的概率是相等的,那麼這種演算法是符合要求的;這在個前提下,儘量降低時間和空間複雜度。
問題二:演算法具有哪些特徵?
答:
穩定:如果a原本在b前面,而a=b,排序之後a仍然在b的前面;
不穩定:如果a原本在b的前面,而a=b,排序之後a可能會出現在b的後面;
內排序:所有排序操作都在記憶體中完成;
外排序:由於資料太大,因此把資料放在磁碟中,而排序通過磁碟和記憶體的資料傳輸才能進行;
時間複雜度: 一個演算法執行所耗費的時間。
空間複雜度: 執行完一個程式所需記憶體的大小。
問題三:除了洗牌演算法還有其他演算法嗎?
答:有。比如:氣泡排序、快速排序、插入排序......