这里用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));
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));
script: var hash = new Object();java : hash.put(key,object);
script: hash[key] = object;java : object = hash.get(key);
script: object = hash[key];
===〉事实上是绝对不能直接用hash的,因为hash依赖于主关键字。
========================================================
介于你的数列是有序的(你已经排列好的)建议你采用比较常规的折半查找法,不过你需要做些特别处理,就是折半法找到关键字时,你应该从这个点使用while向两侧试探,就是找到所有重复的元素了。这种方法最坏也就是查找一半的数据单元,并且她不会改变你的数据表的线性关系。他的平均效率也不错。
========================================================
emu(ston) 的方法有点像是哈西法里的链地址,但肯定不是哈西法,他是把数据象分组为二位数组。如果他的是哈西法那么它的哈西函数就成了hash(key)=key%arr.length,这样的hash函数会带了大量的无用的冲突,从而使哈西表分布混乱,通常情况下为了避免冲突如果采用这种取余数的方法都会寻找一个素数作为分母。所以那不是哈西表。这道题不能直接用哈西法,但是可以利用解决冲突方法已知的特点在比较少的次数里找到重复数字。
=========================================================
哈西表就是把关键字通过哈西函数映射到地址的存贮方法。书上都有了,到底是怎么回事看书去吧,说不完呀。
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> <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>
alert(ar.join().match(/2/g));