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