📄 6_2_1 哈希avl树的基本概念 - 《多任务下的数据结构与算法》 - 免费试读 - book_csdn_net.htm
字号:
urchinTracker();
</SCRIPT>
<!-- /公共页头 --><LINK
href="C:\Documents and Settings\K&G\桌面\6_2_1 哈希AVL树的基本概念 - 《多任务下的数据结构与算法》 - 免费试读 - book_csdn_net.files\style(1).css"
type=text/css rel=stylesheet>
<DIV id=booknav2>
<DIV id=booknavtop>
<UL>
<LI><A href="http://book.csdn.net/">首页</A> </LI>
<LI><A href="http://book.csdn.net/book/morelz.aspx">精品连载</A> </LI>
<LI><A href="http://club.book.csdn.net/people/myclub.aspx">我的书友会</A> </LI>
<LI><A href="http://club.book.csdn.net/people/putblog.aspx">图书秀</A> </LI>
<LI><A href="http://club.book.csdn.net/people/alllist.aspx">书架</A> </LI>
<LI><A href="http://blog.csdn.net/group/bookread/" target=_blank>圈子</A> </LI>
<LI><A href="http://down.csdn.net/app/list.php?tid=502" target=_blank>资源下载</A>
</LI>
<LI><A href="http://bank.csdn.net/" target=_blank><FONT
style="FONT-WEIGHT: bold">银行</FONT></A> </LI></UL></DIV>
<SCRIPT type=text/javascript>
function IsBlank(obj) //查看对象的值是否为空
{
if(obj.replace(/^\s+|\s+$/,"")=="")
{
return true;
}
else
{
return false;
}
}
function SearchBook_Top()
{
if( !IsBlank(document.getElementById("txtTopKey").value))
{
var loc;
var szType;
if(document.getElementById("listSearchType").value==null)
{
szType= document.getElementById("listSearchType").options(document.getElementById("listSearchType").selectedIndex).value;
}
else
{
szType= document.getElementById("listSearchType").value;
}
if(szType==1)
loc="http://book.csdn.net/book/morelz.aspx?key="+escape(document.getElementById("txtTopKey").value);
else
loc="http://club.book.csdn.net/book/s.aspx?key="+escape(document.getElementById("txtTopKey").value);
self.location=loc;
}
}
</SCRIPT>
<DIV id=booknavbottom2>
<DIV class=hotleft><A href="http://book.csdn.net/subject/allbook.htm"
target=_blank>全部图书</A> <FONT color=red>推荐</FONT>:<A
href="http://club.book.csdn.net/book/s.aspx?key=asp.net">ASP.NET</A> <A
href="http://club.book.csdn.net/book/s.aspx?key=ajax">Ajax</A> <A
href="http://club.book.csdn.net/book/s.aspx?key=spring">Spring</A> <A
href="http://club.book.csdn.net/book/s.aspx?key=Hibernate">Hibernate</A> <A
href="http://club.book.csdn.net/book/s.aspx?key=Java">Java</A></DIV>
<DIV class=hotright><SELECT id=listSearchType name=aa> <OPTION value=2
selected>书友会</OPTION> <OPTION value=1>连载</OPTION></SELECT><INPUT
onkeypress=if(event.keyCode==13){SearchBook_Top();} id=txtTopKey maxLength=25><INPUT onclick=SearchBook_Top(); type=button value=搜索 name=提交></DIV></DIV></DIV>
<DIV class=area>
<SCRIPT
src="6_2_1 哈希AVL树的基本概念 - 《多任务下的数据结构与算法》 - 免费试读 - book_csdn_net.files/BookDetailAd.js"
type=text/javascript></SCRIPT>
<DIV class=col1>
<DIV class=lineBlue></DIV><!-- title -->
<DIV class=arcTitle>
<H1><A href="http://book.csdn.net/bookfiles/65">多任务下的数据结构与算法 </A></H1>
<DIV style="FONT-SIZE: 15px; TEXT-ALIGN: center"><A
href="http://book.csdn.net/bookfiles/65/100652558.shtml">6.2.1 哈希AVL树的基本概念
</A></DIV>
<DIV style="FONT-SIZE: 15px; TEXT-ALIGN: center"><A class=url
href="http://book.csdn.net/">http://book.csdn.net/</A> 2006-8-14 14:19:00 </DIV>
<DIV class=clear></DIV>
<DIV
style="BORDER-RIGHT: #0b5f98 1px solid; BORDER-TOP: #0b5f98 1px solid; MARGIN: 0px auto; BORDER-LEFT: #0b5f98 1px solid; WIDTH: 700px; BORDER-BOTTOM: #0b5f98 1px solid">
<DIV
style="PADDING-RIGHT: 1px; PADDING-LEFT: 1px; FLOAT: left; PADDING-BOTTOM: 1px; WIDTH: 16px; COLOR: white; PADDING-TOP: 1px; BACKGROUND-COLOR: #0b5f98">图书导读
</DIV>
<DIV
style="PADDING-LEFT: 2px; FLOAT: right; WIDTH: 670px; LINE-HEIGHT: 16pt; TEXT-ALIGN: left"><!--导读-->
<H1 id=divCurrentNode
style="PADDING-LEFT: 2px; FONT-SIZE: 12px; WIDTH: 100%; COLOR: #b83507; TEXT-ALIGN: left">当前章节:<A
href="http://book.csdn.net/bookfiles/65/100652558.shtml"><FONT color=red>6.2.1
哈希AVL树的基本概念</FONT></A></H1>
<DIV id=divRelateNode style="PADDING-LEFT: 2px">
<DIV style="FLOAT: left; WIDTH: 49%">·<A
href="http://book.csdn.net/bookfiles/65/100652555.shtml">5.1.3 树的遍历算法</A></DIV>
<DIV style="FLOAT: right; WIDTH: 49%">·<A
href="http://book.csdn.net/bookfiles/65/100652556.shtml">5.1.4 树的编码实现</A></DIV>
<DIV style="FLOAT: left; WIDTH: 49%">·<A
href="http://book.csdn.net/bookfiles/65/100652557.shtml">5.1.5
使用树的遍历算法来实现Xcopy功能</A></DIV>
<DIV style="FLOAT: right; WIDTH: 49%">·<A
href="http://book.csdn.net/bookfiles/65/100652559.shtml">6.2.2
哈希AVL树的查找</A></DIV>
<DIV style="FLOAT: left; WIDTH: 49%">·<A
href="http://book.csdn.net/bookfiles/65/100652560.shtml">6.2.3
哈希AVL树的插入</A></DIV>
<DIV style="FLOAT: right; WIDTH: 49%">·<A
href="http://book.csdn.net/bookfiles/65/100652561.shtml">6.2.4
哈希AVL树的删除</A></DIV></DIV></DIV></DIV>
<DIV class=clear></DIV></DIV><!-- main -->
<DIV id=main>
<DIV id=text>
<DIV id=csdn_zhaig_ad_yahoo_2></DIV>
<H3 style="MARGIN-LEFT: 0cm; TEXT-INDENT: 0cm; LINE-HEIGHT: 16.4pt"><A
name=_Toc122884816></A><SPAN lang=EN-US>6.2.1</SPAN><SPAN lang=EN-US>
</SPAN><SPAN style="FONT-FAMILY: 方正准圆简体">哈希</SPAN><SPAN
lang=EN-US>AVL</SPAN><SPAN style="FONT-FAMILY: 方正准圆简体">树的基本概念</SPAN></H3>
<P class=MsoNormal style="LINE-HEIGHT: 16.4pt"><SPAN
style="FONT-FAMILY: 华康简宋">前面介绍了复合数据结构哈希红黑树,它避免了哈希表里数据无序及红黑树查找速度不足的缺点。在软件设计中,经常会追求设计更快的查找算法。像哈希表查找,一次就可以定位到数据,已经够快的了,但是哈希表对哈希函数的设计有很高要求,若哈希函数设计不好,理论上查找的最坏复杂度为</SPAN><SPAN
lang=EN-US>O(n)</SPAN><SPAN style="FONT-FAMILY: 宋体">;</SPAN><SPAN
style="FONT-FAMILY: 华康简宋">在二叉树中,查找速度较快的为</SPAN><SPAN lang=EN-US>AVL</SPAN><SPAN
style="FONT-FAMILY: 华康简宋">树,能不能将哈希表和</SPAN><SPAN lang=EN-US>AVL</SPAN><SPAN
style="FONT-FAMILY: 华康简宋">树结合起来,使得查找更快呢?</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 16.4pt"><SPAN
style="FONT-FAMILY: 华康简宋">本节就讨论另外一个复合数据结构</SPAN><SPAN
style="FONT-FAMILY: 华康简宋; LETTER-SPACING: -0.1pt">—</SPAN><SPAN
style="FONT-FAMILY: 华康简宋">—哈希</SPAN><SPAN lang=EN-US>AVL</SPAN><SPAN
style="FONT-FAMILY: 华康简宋">树。顾名思义,哈希</SPAN><SPAN lang=EN-US>AVL</SPAN><SPAN
style="FONT-FAMILY: 华康简宋">树是哈希表和</SPAN><SPAN lang=EN-US>AVL</SPAN><SPAN
style="FONT-FAMILY: 华康简宋">树的复合数据结构,那么哈希</SPAN><SPAN lang=EN-US>AVL</SPAN><SPAN
style="FONT-FAMILY: 华康简宋">树是不是也采用和哈希红黑树同样的复合方法呢?哈希</SPAN><SPAN
lang=EN-US>AVL</SPAN><SPAN
style="FONT-FAMILY: 华康简宋">树的每个节点是不是既有哈希表的特性,又有</SPAN><SPAN
lang=EN-US>AVL</SPAN><SPAN style="FONT-FAMILY: 华康简宋">树的特性呢?</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 16.3pt"><SPAN
style="FONT-FAMILY: 华康简宋">如果将哈希</SPAN><SPAN lang=EN-US>AVL</SPAN><SPAN
style="FONT-FAMILY: 华康简宋">树设计成类似哈希红黑树,通常</SPAN><SPAN lang=EN-US>AVL</SPAN><SPAN
style="FONT-FAMILY: 华康简宋">树比红黑树查找要快,但插入删除效率较低,哈希</SPAN><SPAN
lang=EN-US>AVL</SPAN><SPAN
style="FONT-FAMILY: 华康简宋">树可以采用哈希表的查找方法进行查找,</SPAN><SPAN
lang=EN-US>AVL</SPAN><SPAN
style="FONT-FAMILY: 华康简宋">树的查找方法在这里不起作用,因此,查找速度也就和哈希表一样,还不如直接使用哈希红黑树。要想查找更快,有必要换个思路来设计哈希</SPAN><SPAN
lang=EN-US>AVL</SPAN><SPAN style="FONT-FAMILY: 华康简宋">树。</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 16.3pt"><SPAN
style="FONT-FAMILY: 华康简宋">设计哈希</SPAN><SPAN lang=EN-US>AVL</SPAN><SPAN
style="FONT-FAMILY: 华康简宋">树的目的首先是要解决哈希表的缺点。哈希表的使用对哈希函数有很高要求,如果哈希函数设计不好可能有很多个数据具有相同的哈希值,而对这些相同哈希值的数据查找是采用顺序查找方式,效率非常低。如果对哈希表具有相同哈希值的数据不使用链式方法解决冲突,而采用</SPAN><SPAN
lang=EN-US>AVL</SPAN><SPAN
style="FONT-FAMILY: 华康简宋">树来解决冲突,那么对具有相同哈希值的数据的查找将变成</SPAN><SPAN
lang=EN-US>AVL</SPAN><SPAN
style="FONT-FAMILY: 华康简宋">树的查找,比链式的顺序查找效率将提高很多。</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 16.3pt"><SPAN
style="FONT-FAMILY: 华康简宋">哈希</SPAN><SPAN lang=EN-US>AVL</SPAN><SPAN
style="FONT-FAMILY: 华康简宋">树与哈希表的区别就是</SPAN><SPAN lang=EN-US>bucket</SPAN><SPAN
style="FONT-FAMILY: 华康简宋">中的指针是</SPAN><SPAN lang=EN-US>AVLTREE</SPAN><SPAN
style="FONT-FAMILY: 华康简宋">的节点类型,因此用</SPAN><SPAN lang=EN-US>C</SPAN><SPAN
style="FONT-FAMILY: 华康简宋">语言结构体来描述哈希</SPAN><SPAN lang=EN-US>AVL</SPAN><SPAN
style="FONT-FAMILY: 华康简宋">树如下。</SPAN></P>
<P class=4><SPAN lang=EN-US>typedef BINTREEBASENODE AVLTREENODE</SPAN><SPAN
style="FONT-FAMILY: 宋体">;</SPAN></P>
<P class=4><SPAN lang=EN-US>typedef struct HASHAVLTREE_st {</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt"> AVLTREENODE
**ppBucket</SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN><SPAN
lang=EN-US style="FONT-SIZE: 9pt"> /* </SPAN><SPAN
style="FONT-SIZE: 9pt; FONT-FAMILY: 华康简宋">索引表指针</SPAN><SPAN lang=EN-US
style="FONT-SIZE: 9pt"> */</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt"> UINT
uBucketCount</SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN><SPAN
lang=EN-US
style="FONT-SIZE: 9pt">
/* </SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 华康简宋">索引表的大小</SPAN><SPAN
lang=EN-US style="FONT-SIZE: 9pt"> */</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt"> UINT
uNodeCount</SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN><SPAN
lang=EN-US
style="FONT-SIZE: 9pt">
/* </SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 华康简宋">表中实际节点的个数</SPAN><SPAN
lang=EN-US style="FONT-SIZE: 9pt"> */</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt"> UINT
uCurBucketNo</SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN><SPAN
lang=EN-US
style="FONT-SIZE: 9pt">
/* </SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 华康简宋">当前要执行的</SPAN><SPAN
lang=EN-US style="FONT-SIZE: 9pt">bucket</SPAN><SPAN
style="FONT-SIZE: 9pt; FONT-FAMILY: 华康简宋">序号</SPAN><SPAN lang=EN-US
style="FONT-SIZE: 9pt"> */</SPAN></P>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -