摘要:作者原文章創建數組除了字面量和外,還可以通過創建,為數組的長度。生成了長度為的空數組,注意,和數組中元素賦值為是有區別的中查看空數組為,而賦值為的數組為。
作者 @zwhu
原文章 @github
創建數組除了字面量和 new Array() 外,還可以通過 Array(n) 創建,n 為數組的長度。 Array(n) 生成了長度為 n 的空數組,注意,和數組中元素賦值為 undefined 是有區別的;chrome 中查看空數組為[undefined * n],而賦值為 undefined 的數組為 [undefined, undefined, ..... , undefined]。
range:
let rangeArray = (start, end) => Array(end - start + 1).fill(0).map((v, i) => i + start) rangeArray(0,10) // return [0,1,2,3,4,5,6,7,8,9,10]
由于map不能對數組中未賦值的元素進行遍歷,所以可以通過 ES6 的新方法 fill 對數組進行填充,把數組中的所有數轉為0(轉成什么都無所謂),然后通過 map 方法將數組中所有0都轉成對應的數字。
ES5 沒有 fill 方法也可以通過 Array.apply(null, {length: end - start + 1}).map((v, i) => i + start) 搞定。說起來比第一種方法速度可能更快。
random:
let randomArray = (start, end) => { let range = rangeArray(start, end) , random = [] while (range.length) { let i = Math.random() * range.length | 0 random.push(range[i]) range.splice(i, 1) } return random } // test let random = randomArray(1, 50) console.log(random.length === 50) console.log(Math.min.apply(Math, random) === 1) console.log(Math.max.apply(Math, random) === 50) console.log(random.sort((a, b) => a - b).every((v, i, a) => v === a[i - 1] || 0 + 1))
具體原理就是:生成一個 range 數組,然后隨機 range 數組的長度,得到下標 i,取出 range 中下標為 i 的元素放入新數組 random 中, 刪除 range 數組這個元素,接著循環,直到 range 數組被刪完。
最近在看「算法」,所以厚著臉皮分析下時間復雜度吧,不對的地方歡迎指出:生成一個 range 數組,2n 次循環,循環 range 數組 n 次,所以加起來就是 3n 次,所需時間為線性級別的,時間復雜度為 O(n),所以看起來還是挺快的。
作為對比,分析一種以前經常用到的方法:
let randomArray = (start, end) => { let o = {} , length = end - start + 1 , random = [] while (random.length < length) { let i = (Math.random() * length + 1) | 0 if (o[i]) continue else { o[i] = true random.push(i) } } return random } // test let random = randomArray(1, 50) console.log(random.length === 50) console.log(Math.min.apply(Math, random) === 1) console.log(Math.max.apply(Math, random) === 50) console.log(random.sort((a, b) => a - b).every((v, i, a) => v === a[i - 1] || 0 + 1))
從上面代碼可以看到在最好的情況下(不會出現 random 結果重復的情況),所需的時間復雜度為 O(n),最壞的情況下(每次都重復的話...循環到無數次),這樣就只能算期望了,數學不好就不瞎算了。
自己對上面的分析之后認為在輸入數特別大的情況下,前一種方法會把后一種方法碾壓成渣,然而實際情況是反被轟成了渣滓,原因是忽略了splice方法,splice 是對數組的元素進行移動操作,會耗費了大量時間。
let a = [], b = [] console.time("push") for (let i = 0; i < 1e5; i++) { a.push(i) } console.timeEnd("push") // ==> 3ms console.time("splice") for (let i = 0; i < 1e5; i++) { b.splice(i, 1, i) } console.timeEnd("splice") // ==> 21ms
從上面可以看出 splice 花費的時間遠遠超過 push 。
寫著寫著就好像與標題相差了萬八千里.... 不過具體寫了什么就沒所謂了,權當記錄。
======= 2015-11-4 更新 ======
let randomArray1 = (start, end) => { let range = rangeArray(start, end) , random = [] , N = range.length while (N--) { let i = Math.random() * (N + 1) | 0 random.push(range[i]) range[i] = range[N] //range.splice(i, 1) } return random }
避免使用 splice 方法,算法沒什么變化;速度大大提升,測試結果如下:
console.time("random1") let random1 = randomArray1(1, 1e5) console.timeEnd("random1") console.time("random2") let random2 = randomArray2(1, 1e5) console.timeEnd("random2") random1: 12ms random2: 79ms
可以看到在我的電腦下,對1萬條數據的處理速度提升了接近6倍。和之前的分析結果還算是相符的。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/86109.html
摘要:含有參數布爾值,默認為表示包含終值,設定為表示不包含終值。只要計算方法一定,隨機種子一定,那么產生的隨機數就不會變均勻分布隨機數組浮點數產生均勻分布隨機數組以內的行列隨機整數以內個隨機浮點數內隨機選擇一個數 使用Python生成數據 使用python原生函數 使用range函數可創建一個整數列表 list = range(10) # 從0開始到10 : [0, 1, 2, 3, 4, ...
摘要:最近也在學習這方面的知識給沐神瘋狂打,強烈推薦他的深度學習課程,鏈接大家自己去搜,就不做廣告了,雖然說自己連入門都算不上,但還是想實現一下自己版本的。同時,計算方法改造成版本的。 起因 周六被小伙伴拖去游泳,美名其曰:鍛煉身體。其實某人就是去泡澡的,哈哈。說正題吧,游完泳在體育場里閑逛,里面很大,轉著轉著看到一個保齡球館,懷著對未知事物的好奇,決定和某人去嘗試一下。我和S同學一人買了一...
摘要:把具名元組以的形式返回,我們可以利用它來把元組里的信息友好地呈現出來。數組支持所有跟可變序列有關的操作,包括和。雙向隊列和其他形式的隊列類雙向隊列是一個線程安全可以快速從兩端添加或者刪除元素的數據類型。 列表表達式 >>> symbols = $¢£¥€¤ >>> codes = [ord(symbol) for symbol in symbols] >>> codes [36, 16...
摘要:可否被整除使用模運算符來檢查余數是否等于。數值增加序號后綴使用模運算符來查找單位數和十位數的值。 這是對 github 上30s代碼片段的翻譯整理,由于作者的文檔是通過腳本生成的,也就懶得去提pull了,整理了放到博客上供大家學習參考,后續會持續跟進翻譯。 Array Array concatenation (合并參數) 使用 Array.concat() 來連接參數中的任何數組或值。...
閱讀 3501·2021-11-18 10:07
閱讀 1596·2021-11-04 16:08
閱讀 1525·2021-11-02 14:43
閱讀 1099·2021-10-09 09:59
閱讀 854·2021-09-08 10:43
閱讀 1087·2021-09-07 09:59
閱讀 976·2019-12-27 11:56
閱讀 1033·2019-08-30 15:56