js算法初窺03(簡單搜索及去重算法)
前面我們了解了一些常用的排序算法,那麽這篇文章我們來看看搜索算法的一些簡單實現,我們先來介紹一個我們在實際工作中一定用到過的搜索算法——順序搜索。
1、順序搜索
其實順序搜索十分簡單,我們還是以第一篇文章寫好的架子作為基礎,在其中加入順序搜索的方法:
//順序搜索 this.sequentialSearch = function(item) { for(var i = 0; i < array.length; i++) { if(item === array[i]) { return i; }; }; return-1; };
我想這個代碼沒什麽好說的。你一定能理解的十分透徹。那麽下面我們來看看二分搜索。
2、二分搜索
我們先來做一個簡單的遊戲。想象一個場景,我們在聚會,大約有7、8個人,這個時候有人提議我們來做個遊戲吧。我來想一個1到100的數字,你們來猜數字是什麽,我會依照我想的數字告訴你們猜測的數字是比我腦海中的數字大了還是小了。這就是二分搜索。
與順序搜索不同的是,二分搜索需要在搜索之前對要搜索的數組排序。我們來看下代碼:
//二分搜索 this.binarySearch = function(item) { //先對數組進行快速排序 this.quickSort();//low和high是邊界指針,也就是item是高了還是低了的表示,mid是我們數組的中間索引變量,element則是對應的mid的元素 var low = 0,high = array.length - 1,mid,element; //如果low小於等於high說明邊界範圍是合理的。 while(low <= high) { //為mid和element變量賦值。 mid = Math.floor((low + high) / 2); element = array[mid]; // 如果中間值比我們要找的元素小,說明item在中間值的右側,要註意我們的數組時排序過後的數組了。// 所以我們直接讓等於0的low的值設置為mid+1,因為item>element,所以item必然在mid+1開始到high的區間範圍內。 // 下同。 if(element < item) { low = mid + 1; } else if(element > item) { high = mid - 1; } else { return mid; }; }; return -1; };
其實二分搜索也並不難,看代碼和註釋就一定可以看懂的。感覺這篇內容實在是不太多,所以我決定再加入一些其他的內容吧。
3、去重
相比大家在面試中被問到過最多的問題就是排序和去重了吧。其實這個東西真的算是老生常談了,但是卻又有它存在的必要,其實說到底,去重更重要的是思想。而不是實現,就跟前面我們學過的那些數據結構和算法一樣。
下面我們就介紹一下去重的一些實現方法吧。
1)set方法
set是ES6新增的一種數據結構——集合,我在前面的有關集合的章節中也介紹過這種數據結構,集合是一種不允許重復的數據存在的數據結構,我們剛好可以利用這種特性來為數組去重。如果你還不了解set數據結構,可以去這裏或者這裏查看。
this.uniqueSetWay = function () { //array.form方法從類似數組或可叠代對象中創建一個新的數組實例 var set = new Set(array); return Array.from(set); }; //測試方法 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())
要註意的是,我們這裏仍舊使用了第一章所構建的數組類。
2)雙循環
//雙循環 this.uniqueDoubleCycle = function () { var newArr = []; var len = array.length; var isRepeat; for(var i=0; i<len; i++) { //第一次循環 isRepeat = false; for(var j=i+1; j<len; j++) { //第二次循環 if(array[i] === array[j]){ isRepeat = true; break; } } if(!isRepeat){ newArr.push(array[i]); } } return newArr; };
這種方法使用了雙重循環設置一個標記位,確定我們加入新數組的元素是否是重復的,代碼很好理解,但是這是效率最低的實現方式。
3)排序輔助去重
//利用排序算法來輔助判斷 this.sortUnique = function () { var newArr = []; this.quickSort(); //將原數組中的第一項放入新數組 var newArr = [array[0]]; // 我們來循環比較 for(var i = 1; i < array.length; i++){ //如果新數組中的最後一項與array[i]不想等,那麽我們就把它加入新數組。 if(array[i] !== newArr[newArr.length - 1]){ newArr.push(array[i]); } } return newArr; };
我們就簡單的介紹這三種去重方法,其實有關於去重的實現有很多種,如果大家想要繼續學習有關去重的一些內容,我這裏給大家貼上幾篇不錯的文章。這裏就不再多說。
1、【 js 算法 】這麽全的數組去重,你怕不怕?
2、也談JavaScript數組去重
3、js數組去重
當然,有關數組去重的文章遠不止這些,只是個人覺得這些內容還不錯。本文中的代碼也是借鑒於此。那麽本文到這裏也就差不多結束了,下面會和大家一起學習一下算法模式(遞歸、動態規劃等)。
最後,由於本人水平有限,能力與大神仍相差甚遠,若有錯誤或不明之處,還望大家不吝賜教指正。非常感謝!
js算法初窺03(簡單搜索及去重算法)