搞笑一下:var ar=[1,2,2,2,5,6,6,9];
alert(ar.join().match(/2/g));

解决方案 »

  1.   

    llrock(百乐宝||昨夜星辰) 说的哈希表原理比较可行。
      

  2.   

    这里用array模拟了一个表,用hash模拟了一个查询:var ar=[[1,"abc"],[2,"de"],[6,"f"],[9,"ghi"],[2,"jk"],[3,"lmn"],[2,"o"],[1,"pqr"],[3,"st"]];
    var hash=new Object();
    /* begin to build hash table*/
    for (var i=0;i<ar.length;i++){
    var key = ar[i][0];
    if (hash[key]==null){
    hash[key]=new Array();
    }
    var t = hash[key];
    t[t.length]=ar[i][1];
    }
    function select(k){
    if (hash[k])
    return hash[k].join("\n");
    else
    return "";
    }
    alert(select(1));
    alert(select(2));
    alert(select(3));
    alert(select(4));
    alert(select(6));
    alert(select(9));
      

  3.   

    emu(ston) 的也真夠高深﹐看得我不知怎么出來的﹐先copy下來再研究一下﹐謝謝你了。另﹕哈希表原理是怎樣﹐可以簡單說說嗎
      

  4.   

    呵呵,hash理论我是不大懂的。上面的这种写法我是从秋水那里偷学来的。其实用起来和java中的Hashtable或者HashMap差不多:java  : Hashtable hash = new Hashtable();
    script: var hash = new Object();java  : hash.put(key,object);
    script: hash[key] = object;java  : object = hash.get(key);
    script: object = hash[key];
      

  5.   

    昏,[[我是说模仿哈西表]],利用哈西的冲突,因为你的数列中存在着重复数字,如果把他们看作是关键字的话(只能是看作),于是就必然至少存在这些冲突,这样的话如果你采用哈西表来存储数据项的话,你只需要纪录冲突的次数,那么你只需要从Hash(key)开始通过hash函数比较你纪录的冲突次数就可以了;或者从Hash(key)开始通过hash函数遍历到Hash(key)为空或哈西表末尾。我后来想了想,这样当出现最坏的情况,也就是你的Hash(key)为1,责任就需要遍历绝大多数单元,并且这种“算法”增加了空间复杂度。所以还是别用Hash表了(我思考了比较常用的几种构造哈西函数和解决冲突的方法)。
    ===〉事实上是绝对不能直接用hash的,因为hash依赖于主关键字。
    ========================================================
    介于你的数列是有序的(你已经排列好的)建议你采用比较常规的折半查找法,不过你需要做些特别处理,就是折半法找到关键字时,你应该从这个点使用while向两侧试探,就是找到所有重复的元素了。这种方法最坏也就是查找一半的数据单元,并且她不会改变你的数据表的线性关系。他的平均效率也不错。
    ========================================================
     emu(ston) 的方法有点像是哈西法里的链地址,但肯定不是哈西法,他是把数据象分组为二位数组。如果他的是哈西法那么它的哈西函数就成了hash(key)=key%arr.length,这样的hash函数会带了大量的无用的冲突,从而使哈西表分布混乱,通常情况下为了避免冲突如果采用这种取余数的方法都会寻找一个素数作为分母。所以那不是哈西表。这道题不能直接用哈西法,但是可以利用解决冲突方法已知的特点在比较少的次数里找到重复数字。
    =========================================================
    哈西表就是把关键字通过哈西函数映射到地址的存贮方法。书上都有了,到底是怎么回事看书去吧,说不完呀。
      

  6.   

    哇﹗真是越看越多就越高深﹐畢竟不是學計算機出身﹐這些太復雜的看來不是我輩之所能﹐我就把我做的無限層樹狀給大家看看﹐希望借各位之手能更優化<Script Language="JavaScript">
    var strStyle='<style type="text/css">'
    strStyle+='span.SelectIng{color:#ff00ff;border:solid 1pt #666666;padding:0.5pt;height:4px;background-color:#cccccc;}'
    strStyle+='span.NoSelect{color:#000084;border:solid 1pt #ffffff;padding:0.5pt;height:4px;background-color:#ffffff;}'
    strStyle+='span.SelectEd{color:#D02090;border:solid 1pt #888888;padding:0.5pt;height:4px;background-color:#f3f3f3;}'
    strStyle+='</style>'
    document.write(strStyle)var myRs=new Array(), selectItem;
    function compare(a,b) {return parseInt(a[1]) - parseInt(b[1])}
    function InsertItem(s){myRs[myRs.length++] = s.split(/,/);}function ExCloAll(n){
    var d=document.all('0'), e=d.all.tags('div')
    for (i=0;i<e.length;i++)e[i].style.display=(n==1?'block':'none')
    e=d.all.tags('p')
    for (i=0;i<e.length;i++){if(ChkExist(e[i].children[1].value))e[i].children[0].innerText=(n==1?'- ':'+ ')}
    }function ExCloItem(){
    var c,e=event.srcElement, p=e.parentElement.children
    if(selectItem!=null)selectItem.className='NoSelect';
    e.className='SelectEd'
    selectItem=event.srcElement;
    if(c=document.all(e.value)){
    p[0].innerText=(p[0].innerText=='+ '?'- ':'+ ')
    c.style.display=(c.style.display=='none'?'block':'none')
    }else{p[0].innerText='- '}
    }
    function ExCloItem2(){
    var c,e=event.srcElement, p=e.parentElement.children
    if(c=document.all(p[1].value)){
    e.innerText=(e.innerText=='+ '?'- ':'+ ')
    c.style.display=(c.style.display=='block'?'none':'block')
    }else e.innerText='- '
    }function OutItem(){
    var e=event.srcElement
    if(selectItem != '')e.className=(selectItem==e?'SelectEd':'NoSelect')
    else e.className='NoSelect'
    }function ChkExist(n){  //這是檢測是否存在子項的﹐有待優化
    n=parseInt(n)
    if((n<myRs[0][1])||(n>myRs[myRs.length-1][1]))return false
    var a,b,c,x=0, y=parseInt(myRs.length/2), z=myRs.length-1
    while((x!=y)&&(y!=z)){
    a=myRs[x][1], b=myRs[y][1], c=myRs[z][1]
    if(n==a||n==b||n==c)return true
    if(n>b)x=y;
    else z=y;y=parseInt(x+z);
    y=parseInt((x+z)/2);
    }
    return false
    }function drawTree(n){   //這個是畫出父層為n的項﹐有待優化﹐就是發這個貼的目的
    if(n==0){
    myRs.sort(compare)
    document.write('<p style="font:10pt;cursor:hand;"><span onclick="ExCloAll(1)">全部展開</span>&nbsp;&nbsp;<span onclick="ExCloAll(0)">全部合攏</span></p>')
    }
    if (ChkExist(n)!=true)return
    document.write('<div id="'+n+'" style="font:10pt;cursor:hand;'+(n!=0?'position:relative;left:20;display:none;':'')+'">')
    for(var i=0;i<myRs.length;i++){
    if (parseInt(myRs[i][1])>n)break;
    if (myRs[i][1]==n){
    document.write('<p style="margin:0pt;"><span style="vertical-align:top;" onclick="ExCloItem2()">'+(ChkExist(myRs[i][0])?'+ ':'- ')+'</span>')
    document.write('<span onclick="ExCloItem()" value="'+myRs[i][0]+'" class="NoSelect" onmouseout="OutItem()" onmouseover="this.className=\'SelectIng\'">'+myRs[i][2]+'</span></p>')
    drawTree(myRs[i][0])
    }
    }
    document.write('</div>')
    }InsertItem('1,0,根目錄1')
    InsertItem('11,1,子目錄1')
    InsertItem('111,11,孫目錄1')
    InsertItem('1111,111,曾孫目錄')
    InsertItem('11111,1111,玄孫目錄')
    InsertItem('12,1,子目錄2')
    InsertItem('2,0,根目錄2')
    InsertItem('21,2,子目錄A')
    InsertItem('22,2,子目錄B')
    InsertItem('3,0,根目錄3')
    drawTree(0)
    </Script>
      

  7.   

    在JS里面,这样已经是最高效率了,何必这么麻烦呢? emu(ston) 已经说出了RegExp的方法:var ar=[1,2,2,2,5,6,6,9];
    alert(ar.join().match(/2/g));