日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

js算法初窥03(搜索及去重算法)

發(fā)布時(shí)間:2023/12/2 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 js算法初窥03(搜索及去重算法) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

  前面我們了解了一些常用的排序算法,那么這篇文章我們來(lái)看看搜索算法的一些簡(jiǎn)單實(shí)現(xiàn),我們先來(lái)介紹一個(gè)我們?cè)趯?shí)際工作中一定用到過(guò)的搜索算法——順序搜索。

1、順序搜索

  其實(shí)順序搜索十分簡(jiǎn)單,我們還是以第一篇文章寫(xiě)好的架子作為基礎(chǔ),在其中加入順序搜索的方法:

//順序搜索 this.sequentialSearch = function(item) {for(var i = 0; i < array.length; i ) {if(item === array[i]) {return i;};};return -1; };

  我想這個(gè)代碼沒(méi)什么好說(shuō)的。你一定能理解的十分透徹。那么下面我們來(lái)看看二分搜索。

2、二分搜索

  我們先來(lái)做一個(gè)簡(jiǎn)單的游戲。想象一個(gè)場(chǎng)景,我們?cè)诰蹠?huì),大約有7、8個(gè)人,這個(gè)時(shí)候有人提議我們來(lái)做個(gè)游戲吧。我來(lái)想一個(gè)1到100的數(shù)字,你們來(lái)猜數(shù)字是什么,我會(huì)依照我想的數(shù)字告訴你們猜測(cè)的數(shù)字是比我腦海中的數(shù)字大了還是小了。這就是二分搜索。

  與順序搜索不同的是,二分搜索需要在搜索之前對(duì)要搜索的數(shù)組排序。我們來(lái)看下代碼:

//二分搜索 this.binarySearch = function(item) {//先對(duì)數(shù)組進(jìn)行快速排序this.quickSort();//low和high是邊界指針,也就是item是高了還是低了的表示,mid是我們數(shù)組的中間索引變量,element則是對(duì)應(yīng)的mid的元素var low = 0,high = array.length - 1,mid,element;//如果low小于等于high說(shuō)明邊界范圍是合理的。while(low <= high) {//為mid和element變量賦值。mid = Math.floor((low high) / 2);element = array[mid];// 如果中間值比我們要找的元素小,說(shuō)明item在中間值的右側(cè),要注意我們的數(shù)組時(shí)排序過(guò)后的數(shù)組了。// 所以我們直接讓等于0的low的值設(shè)置為mid 1,因?yàn)閕tem>element,所以item必然在mid 1開(kāi)始到high的區(qū)間范圍內(nèi)。// 下同。if(element < item) {low = mid 1;} else if(element > item) {high = mid - 1;} else {return mid;};};return -1; };

?  其實(shí)二分搜索也并不難,看代碼和注釋就一定可以看懂的。感覺(jué)這篇內(nèi)容實(shí)在是不太多,所以我決定再加入一些其他的內(nèi)容吧。

3、去重

  想必大家在面試中被問(wèn)到過(guò)最多的問(wèn)題就是排序和去重了吧。其實(shí)這個(gè)東西真的算是老生常談了,但是卻又有它存在的必要,其實(shí)說(shuō)到底,去重更重要的是思想,而不是實(shí)現(xiàn),就跟前面我們學(xué)過(guò)的那些數(shù)據(jù)結(jié)構(gòu)和算法一樣。

  下面我們就介紹一下去重的一些實(shí)現(xiàn)方法吧。

  1)set方法

    set是ES6新增的一種數(shù)據(jù)結(jié)構(gòu)——集合,我在前面的有關(guān)集合的章節(jié)中也介紹過(guò)這種數(shù)據(jù)結(jié)構(gòu),集合是一種不允許重復(fù)的數(shù)據(jù)存在的數(shù)據(jù)結(jié)構(gòu),我們剛好可以利用這種特性來(lái)為數(shù)組去重。如果你還不了解set數(shù)據(jù)結(jié)構(gòu),可以去這里或者這里查看。

this.uniqueSetWay = function () {//array.form方法從類似數(shù)組或可迭代對(duì)象中創(chuàng)建一個(gè)新的數(shù)組實(shí)例var set = new Set(array);return Array.from(set); };//測(cè)試方法 var repeatArray = new ArrayList(); repeatArray.insert(1); repeatArray.insert(1); repeatArray.insert(3); repeatArray.insert(3); repeatArray.insert(5); repeatArray.insert(7); repeatArray.insert(7); repeatArray.insert(9); repeatArray.insert(9); repeatArray.insert(8); console.log(repeatArray.uniqueSetWay())

    要注意的是,我們這里仍舊使用了第一章所構(gòu)建的數(shù)組類。

  2)雙循環(huán)

//雙循環(huán) this.uniqueDoubleCycle = function () {var newArr = [];var len = array.length;var isRepeat;for(var i=0; i<len; i ) { //第一次循環(huán)isRepeat = false;for(var j=i 1; j<len; j ) { //第二次循環(huán)if(array[i] === array[j]){isRepeat = true;break;}}if(!isRepeat){newArr.push(array[i]);}}return newArr; };

    這種方法使用了雙重循環(huán)設(shè)置一個(gè)標(biāo)記位,確定我們加入新數(shù)組的元素是否是重復(fù)的,代碼很好理解,但是這是效率最低的實(shí)現(xiàn)方式。

  3)排序輔助去重

//利用排序算法來(lái)輔助判斷 this.sortUnique = function () {var newArr = []; this.quickSort();//將原數(shù)組中的第一項(xiàng)放入新數(shù)組var newArr = [array[0]];// 我們來(lái)循環(huán)比較for(var i = 1; i < array.length; i ){//如果新數(shù)組中的最后一項(xiàng)與array[i]不想等,那么我們就把它加入新數(shù)組。if(array[i] !== newArr[newArr.length - 1]){newArr.push(array[i]);}} return newArr; };

    我們就簡(jiǎn)單的介紹這三種去重方法,其實(shí)有關(guān)于去重的實(shí)現(xiàn)有很多種,如果大家想要繼續(xù)學(xué)習(xí)有關(guān)去重的一些內(nèi)容,我這里給大家貼上幾篇不錯(cuò)的文章。這里就不再多說(shuō)。

    1、【 js 算法 】這么全的數(shù)組去重,你怕不怕?

    2、也談JavaScript數(shù)組去重

    3、js數(shù)組去重

    當(dāng)然,有關(guān)數(shù)組去重的文章遠(yuǎn)不止這些,只是個(gè)人覺(jué)得這些內(nèi)容還不錯(cuò)。本文中的代碼也是借鑒于此。那么本文到這里也就差不多結(jié)束了,下面會(huì)和大家一起學(xué)習(xí)一下算法模式(遞歸、動(dòng)態(tài)規(guī)劃等)。

?

  最后,由于本人水平有限,能力與大神仍相差甚遠(yuǎn),若有錯(cuò)誤或不明之處,還望大家不吝賜教指正。非常感謝!


更多專業(yè)前端知識(shí),請(qǐng)上 【猿2048】www.mk2048.com

總結(jié)

以上是生活随笔為你收集整理的js算法初窥03(搜索及去重算法)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。