形式化描述: input Array(size=N) output Array1=Array的無重復保序的子集, 無重復是 " /> 久久毛片基地,99C视频色欲在线,欧美另类老女人

天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

JavaScript 數組的 uniq 方法

給Array本地對象增加一個原型方法,它的用途是刪除數組條目中重復的條目(可能有多個),返回值是一個包含被刪除的重復條目的新數組。

形式化描述:
input
Array(size=N)
output
Array1=Array的無重復保序的子集,
無重復是指,對任意a,b屬于Array1,a!=b
保序是指,若a在Array的下標小于b在Array的下標,則a在Array1中的下標也小于b在Array的下標
Array2=Array-Array1,保序
realazy給出了一個新解,思路非常清晰:順序遍歷訪問每個元素,如果這個元素的值已經訪問過了,則加入Array2,否則加入Array1。判斷當前元素的值是否已經訪問過所采用的方法是順序遍歷已經訪問過的所有元素。 
易見該算法復雜度約O(N^2)。

我在他的算法框架下稍微做了一些改進,關鍵在于遍歷過程中如何判斷當前元素的值是否已經訪問過。在原數組值域為正整數且極差(range=max value-min value)不太大的條件下,可以采用簡單的"桶"算法。
準備一個長度為range的boolean數組b,初始化全為false。對于原數組中每個值value,如果b[value]=true,則表明這個值訪問過,放入Array2,否則放入Array1同時令b[value]=true。 
這顯然是O(N)的算法,代價是額外的空間復雜度range,而且要求原數組值域為正整數。
不難推廣到值域為整數的情形,事實上只需考察桶號value-min(Array)即可轉化為正整數的情形。

為了避免range太大造成的空間的浪費,在"桶"算法基礎上改進為散列算法,具體說來是線性同余開散列法。目的是將值域壓縮映射到一個可控的小的連續正整數子集中,同時保證不同的原象對應的相同的象的概率要盡可能小,也就是說桶與桶之間要盡量負載均衡。 
例如這是一個值域為實數的散列函數:
key=hashFun(value)=Math.floor(value)*37%91
這仍然是O(N)的算法,(顯然O(N)是所有uniq算法的復雜度下界),好處是可以控制空間的開銷,而且可以適應非整數值域,只需要設計相應的散列函數即可。



下面是桶(bucket)算法的實現:
   var resultArr = [],
       returnArr = [], 
       origLen = this.length,
       resultLen;
   var maxv=this[0],minv=this[0];
   for (var i=1; i<origLen; ++i){
       if(this[i]>maxv)maxv=this[i];
       else if(this[i]<minv)minv=this[i]; 
   }
   var blen=maxv-minv+1;
   var b=new Array(blen);
   for(var i=0;i<blen;++i)b[i]=false;
   for (var i=0; i<origLen; ++i){
       if (b[this[i]-minv]){
           returnArr.push(this[i]); 
       } else {
           resultArr.push(this[i]);
           b[this[i]-minv]=true;
       }
   }
   resultLen = resultArr.length;
   this.length = resultLen;
   for (var i=0; i<resultLen; ++i){ 
       this[i] = resultArr[i];
   }
   return returnArr;
下面是散列(hash)算法的實現
var shuffler = 37
var beta=0.007;
var origLen=this.length
var bucketSize=Math.ceil(origLen*beta);
var hashSet=new Array(bucketSize); 
var hashFun = function(value){
var key = (Math.floor(value)*shuffler)%bucketSize;
return key;
}
//init hashSet
for(var i=0;i<bucketSize;i++)hashSet[i]=new Array();
//
var ret=[],self=[];
var key,value; 
var bucket,openLen;
var everConflict;
for(var i=0;i<origLen;i++){
value=this[i];
key=hashFun(value);
bucket = hashSet[key];
openLen=bucket.length;//if(openLen>1)return;
everConflict=false; 
for(var j=0;j<openLen;j++){
 if(bucket[j]==value){
  ret.push(value);
  everConflict=true;
  break;
 }
}
if(!everConflict){
 bucket.push(value);
 self.push(value);
}
}
   selfLen = self.length;
   this.length = selfLen;
   for (i=0; i<selfLen; ++i){
       this[i] = self[i];
   }
//compute average bucket size
var lens=[],sum=0;
for(var i=0;i<hashSet.length ;++i){lens.push(hashSet[i].length);sum+=hashSet[i].length};
average=sum/hashSet.length;//watch lens,average
   return ret;


用k*10000個0~k*100的隨機整數測試計算時間(ms)
k 1 2 3 4 5
realazy 240 693 1399 2301 3807 
bucket 55 101 141 219 293
hash 214 411 654 844 1083
測試框架借鑒了http://realazy.org/lab/uniq.html
測試環境Firefox2.0.0.6/Ubuntu7.10/2.66GHzP4/1024MBDDR 

JavaScript技術JavaScript 數組的 uniq 方法,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 精品午夜久久影视 | 三级在线观看网站 | 国产成人免费全部网站 | 爽娇妻快高h| 亚洲中文字幕手机版 | 欧美写真视频一区 | 绑着男军人的扒开内裤 | 曰本熟妇乱妇色A片在线 | 好大好硬好湿再深一点网站 | 娇小8一12xxxx第一次 | 手机毛片免费看 | 幸福草电视剧演员表介绍 | 2017天天拍天天拍香蕉视频 | 国产偷窥盗摄一区二区 | 亚洲青青草原 | 涩涩爱涩涩电影网站 | caoporm国产精品视频免费 | 色戒未删减版在线观看完整 | 暖暖视频大全免费观看 | 亚洲伊人成综合人影院 | 美女被艹网站 | 99久久爱re热6在线播放 | 亚洲性夜夜夜色综合网 | 欧美精品中文字幕亚洲专区 | 久久热在线视频精品1 | 久久WWW免费人成一看片 | 麻豆人妻换人妻X99 麻豆区蜜芽区 | 色多多污污下载 | 巨胸美乳中文在线观看 | 学生精品国产在线视频 | 色欲人妻无码AV精品一区二区 | 97超级碰碰人妻中文字幕 | 国产日韩欧美有码在线视频 | 国产女人与黑人在线播放 | 欧美日韩另类在线专区 | 中文字幕无码乱人伦蜜桃 | 成人免费视频一区 | 国产AV精品久久久毛片 | 中文在线观看永久免费 | 一个人在线观看免费高清视频在线观看 | 色久久久综合88一本道 |