??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美天堂在线,亚洲视频日本,亚洲综合一区在线http://www.aygfsteel.com/flysky19/category/20413.htmljava之\zh-cnThu, 08 Mar 2007 17:27:02 GMTThu, 08 Mar 2007 17:27:02 GMT60hash函数学习(fn)ȝQ以?qing)与hashcode()、hashMap的关p?/title><link>http://www.aygfsteel.com/flysky19/articles/102289.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Tue, 06 Mar 2007 17:26:00 GMT</pubDate><guid>http://www.aygfsteel.com/flysky19/articles/102289.html</guid><wfw:comment>http://www.aygfsteel.com/flysky19/comments/102289.html</wfw:comment><comments>http://www.aygfsteel.com/flysky19/articles/102289.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/flysky19/comments/commentRss/102289.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/flysky19/services/trackbacks/102289.html</trackback:ping><description><![CDATA[ <br />以前一直觉得hash函数很深奥,上王?qing)的《数据库实现原理》的时候,g明白?jin)一点点Q但是到学java<br />的时候,频繁接触到hashcode()QhashMapq些Q就d惌三者之间有关系吗?hash函数是什么?hashcode()Q?br />hashMap和hash函数又有什么关pdQ?br /><br />今天l于对这个问题有?jin)初步的学?fn)和理解:(x)<br /><br />1.什么是hash函数Q?br />1Q来自:(x)http://beyond911.bokee.com/1047973.html<br /><br />什么是HASH函数(l典例子)                                   <br /><br />让我们先来了(jin)解一些基本知识,作作预热只有q样才能更好的了(jin)解hash?br /><br />HashQ一般翻译做"散列"Q也有直接音译ؓ(f)"哈希"的,是把Q意长度的输入Q又叫做预映, pre-imageQ,通过散列法Q变换成固定长度的输出,该输出就是散列倹{这U{换是一U压~映,也就是,散列值的I间通常q小于输入的I间Q不同的输入可能?x)散列成相同的输出,而不可能从散列值来唯一的确定输入倹{?br /><br />单的说就是一U将L长度的消息压~到某一固定长度的消息摘要的函数?br /><br />HASH主要用于信息安全领域中加密算法,他把一些不同长度的信息转化成杂q128位的~码?叫做HASH? 也可以说Qhash是扑ֈ一U数据内容和数据存放地址之间的映关p?br /><br />2Q来自:(x)http://www.hour41.com/blog/hour41/entry/200701255<br />计算理论中,没有Hash函数的说法,只有单向函数的说法。所谓的单向函数Q是一个复杂的定义Q大家可以去看计理论或者密码学斚w的数据。用“hcZ的语言描述单向函数是Q如果某个函数在l定输入的时候,很容易计出其结果来Q而当l定l果的时候,很难计算?gu)入来Q这是单项函数。各U加密函数都可以被认为是单向函数的D。Hash函数Q或者成为散列函敎ͼ(j)也可以看成是单向函数的一个D。即它接q于满单向函数的定义?br /><br />Hash函数q有另外的含义。实际中的Hash函数是指把一个大范围映射C个小范围。把大范围映到一个小范围的目的往往是ؓ(f)?jin)节省空_(d)使得数据Ҏ(gu)保存。除此以外,Hash函数往往应用于查找上。所以,在考虑使用Hash函数之前Q需要明白它的几个限Ӟ(x)<br /><br />1. Hash的主要原理就是把大范围映到范_(d)所以,你输入的实际值的个数必须和小范围相当或者比它更。不然冲H就?x)很多?br />2. ׃HashD单向函数Q所以,你可以用它来Ҏ(gu)据进行加密?br />3. 不同的应用对Hash函数有着不同的要求;比如Q用于加密的Hash函数主要考虑它和单项函数的差距,而用于查扄Hash函数主要考虑它映到范围的冲突率?br /><br />3Q自qȝQ?br />   aQhash函数是把Q意长度的输入Q又叫做预映, pre-imageQ,通过散列法Q变换成固定长度的输出,该输出就是散列倹{这U{换是一U压~映,也就是,散列值的I间通常q小于输入的I间Q不同的输入可能?x)散列成相同的输出,而不可能从散列值来唯一的确定输入倹{?br />例如Q散列算法ؓ(f)求余的hash函数?br />   bQ实际中的Hash函数是指把一个大范围映射C个小范围。把大范围映到一个小范围的目的往往是ؓ(f)?jin)节省空_(d)使得数据Ҏ(gu)保存?br />   cQ在数据l构中,hash是扑ֈ一U数据内容和数据存放地址之间的映关p,比如Q?1?0求余后得1Q就?1存放到第一个桶里(或者是W一块内存单元中Q,x数据和存攑֜址建立映射关系Q?br />   dQ所以,有了(jin)数据内容和数据存攑֜址之间的映关p,Hash函数往往应用于查找上。不q,利用hash函数的查找跟以前自己理解的不同,以前自己以ؓ(f)是通过hash函数p立即扑ֈ存储地址Q就像HashMap中根据key立即能找到value一P其实不是q样的,hash函数只不q是Ҏ(gu)散列法和解军_H的Ҏ(gu)来提供一U定位和查找的方式,hashmap中根据可以马上找到value值是理所当然的,但是Ҏ(gu)hash函数扑ֈkey值就不是立即的了(jin)。当?dng)Z(jin)方便查找Q尽量得hash函数无冲H,可以唯一定地址是最理想的。娃哈哈Q终于弄清楚q一点了(jin)Q?br />   eQHash函数是指把一个大范围映射C个小范围Q所以hash函数是求余之cȝ压羃函数Q(比如Q?1Q?3的范围压~ؓ(f)1Q?Q,而不?0xQ?q样的扩散函敎ͼQ比如,11Q?3的范围扩散ؓ(f)117Q?37Q;<br />   fQ由于HashD单向函数Q所以,你可以用它来Ҏ(gu)据进行加密?br />   gQ不同的应用对Hash函数有着不同的要求;比如Q用于加密的Hash函数主要考虑它和单项函数的差距,而用于查扄Hash函数主要考虑它映到范围的冲突率?br /><br />2.散列表相关知识的pȝ学习(fn)Q?br />数据l构自考网Qhttp://student.zjzk.cn/course_ware/data_structure/web/chazhao/chazhao9.4.1.htm<br /><br />3.  JDK中HashMap的分?br />1Q来自:(x)http://chinakite.javaeye.com/blog/25073<br />2Q请问hashtablec里面的hash函数是怎么L(fng)Q?br />来自Qhttp://topic.csdn.net/t/20020311/09/567386.html<br /><br />他是调用每个c自己本w的hashCode的方法来定的?<br />  public   synchronized   Object   put(Object   key,   Object   value)   {  <br />  ...  <br />  int   hash   =   key.hashCode();//是q里?jin)?<br />  int   index   =   (hash   &   0x7FFFFFFF)   %   tab.length;  <br />  ...  <br />          }  <br />  详细L(fng)java的源文g<br /><br /><br />String的散列值是由内容{换来的,Objectcȝ却省散列函数q回对象地址转换来的散列倹{?br /><br />4.面试题:(x)<br />来自Qhttp://www.javaref.cn/topics/Question/10566.html<br /><br />问题Q?br /><br />a)请问哈希?(hashtable) 是如何存储数据的 Q?br /><br />{案Q?Hashtable 是用来存?key ?value 对的数据l构 , Ҏ(gu)讑֮?hash 函数 H(key) 和处理冲H的Ҏ(gu)一l关键字Q?key Q映象到一个有限的q箋的地址集(区间Q上Qƈ以关键字在地址集中的“象”作录在表中存储位置Q这U表便成?hashtable.<br /><br />b)是否两个键值通过 hash 函数产生的映地址?x)一P怎么办?<br /><br />{案 : 是,一般情况下Q完全避免冲H是很难的。因为通常关键字集合会(x)比目标地址I间大。哈希函数要量避免冲突Q避免不同的关键字生相同的 hash |(j)Q一l关键字的哈西地址可能的均匀分布在整个地址区间。所以有一些冲H处理方法:(x)开攑֮址法,再哈希法Q链地址法(用链表保存冲H的|(j)Q公共溢出区。?<br /><br />关于哈希表,有个与实际编E更密切的问题可以一问:(x)Z证逻辑上的正确性,哈希表对可以作ؓ(f)键值的cd有什么要求?  C++Q除容器对元素类型的标准需求外Q还需overload == ?< JavaQ需override equals(逻辑上的正确?和hashCode(性能) C#Q需override Equals(逻辑上的正确?和HashCode(性能)     <br /><br /><br /><br /><img src ="http://www.aygfsteel.com/flysky19/aggbug/102289.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/flysky19/" target="_blank">不断前进的小乌龟</a> 2007-03-07 01:26 <a href="http://www.aygfsteel.com/flysky19/articles/102289.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>快速排序学?fn)ȝhttp://www.aygfsteel.com/flysky19/articles/102285.html不断前进的小乌龟不断前进的小乌龟Tue, 06 Mar 2007 16:28:00 GMThttp://www.aygfsteel.com/flysky19/articles/102285.htmlhttp://www.aygfsteel.com/flysky19/comments/102285.htmlhttp://www.aygfsteel.com/flysky19/articles/102285.html#Feedback0http://www.aygfsteel.com/flysky19/comments/commentRss/102285.htmlhttp://www.aygfsteel.com/flysky19/services/trackbacks/102285.html
昨天׃(jin)一天的旉学习(fn)ȝ冒(chng)排序Q今天下军_(j)把数据结构的相关内容Q各U排序,?wi)?br />查找法{都大概学习(fn)?jin)一遍,把时间复杂度和空间复杂度{概느清了(jin)Q终于有?jin)一点点
的踏实感Q因己没考研Q本U基也没打牢QL觉自pM一个h都有一大段的差距,
q写E序和找实习(fn)工作都觉得自己很没信?j),~少底气Q因Z些研I生里面大家都会(x)的基
知识我丝毫不懂,真是太打击自׃(jin)Q!

自己的近期安排:(x)

今天ȝ?jin)快速排序,hash函数{知识之后,明天开始就要踏t实实的看Y件测试的论文?jin)!Q?br />在看论文的同Ӟ如果想练l手Q最好坚持把上学期的“决{树(wi)”的作业实现?jin),q样自己
有信心(j)面对一切了(jin)Q!

另外Q好好上李老师数据挖掘的课Q千万不要迟刎ͼ最??0分就要去到新信息|好好学习(fn)Q?br />d书馆借几本好书,提前学习(fn)和准备!

q有Q明天别忘了(jin)问问解婷婷和杨惠她们的英文论文都是从哪下的?怎么搜烦(ch)Q比如,Proges的用?
怎么知道哪些英文论文比较好?

好了(jin)Q现在言规正传,学习(fn)快速排序:(x)

快速排序和冒(chng)排序都是交换排序cdQ快排的法思想是:(x)
每次选一个基准|比如W一个数Q,让小于这个基准值的数向左移Q大于这个基准值的数向右移Q?br />一移动之后,q个基准值就定位到合适的位置?jin),它的左边的数比它(yu),双的数比它大;一可?br />定位一个数Q左边和双分别递归Qn-1后所有数都定位到合适位|了(jin)Q?br />
法分析
     快速排序的旉主要耗费在划分操作上Q对长度为k的区间进行划分,共需k-1ơ关键字的比较?br />
Q?Q最坏时间复杂度
     最坏情冉|每次划分选取的基准都是当前无序区中关键字最?或最?的记录,划分的结果是基准左边的子区间为空(或右边的子区间ؓ(f)I?Q而划分所得的另一个非I的子区间中记录数目Q仅仅比划分前的无序Z记录个数减少一个?br />     因此Q快速排序必dn-1ơ划分,Wiơ划分开始时区间长度为n-i+1Q所需的比较次Cؓ(f)n-i(1≤i≤n-1)Q故ȝ比较ơ数辑ֈ最大|(x)
               Cmax = n(n-1)/2=O(n2)
     如果按上面给出的划分法Q每ơ取当前无序区的W?个记录ؓ(f)基准Q那么当文g的记录已按递增?或递减?排列Ӟ每次划分所取的基准是当前无序Z关键字最?或最?的记录,则快速排序所需的比较次数反而最多?br />
Q?Q?最好时间复杂度
     在最好情况下Q每ơ划分所取的基准都是当前无序区的"中?记录Q划分的l果是基准的左、右两个无序子区间的长度大致相等。ȝ关键字比较次敎ͼ(x)
        0(nlgn)
注意Q?br />     用递归?wi)来分析最好情况下的比较次数更单。因为每ơ划分后左、右子区间长度大致相{,故递归?wi)的高度为O(lgn)Q而递归?wi)每一层上各结Ҏ(gu)对应的划分过E中所需要的关键字比较次数d不超qnQ故整个排序q程所需要的关键字比较L数C(n)=O(nlgn)?br />     因ؓ(f)快速排序的记录Udơ数不大于比较的ơ数Q所以快速排序的最坏时间复杂度应ؓ(f)0(n2)Q最好时间复杂度为O(nlgn)?br />
具体的算法描q、代码实现、算法分析和动画演示参见Q?br />数据l构自考网
http://student.zjzk.cn/course_ware/data_structure/web/paixu/paixu8.3.2.4.htm


附排序的面试题:(x)
来自Qhttp://www.javaref.cn/topics/Question/10566.html
问题Q?

a)冒(chng) (bubble sort) 和快速排?(quick sort) 的区别?它们的时间复杂度Q?br />
冒(chng)Q每排序将最大值安|到最后一个位|上Q时间复杂度?O(n qx ).
快速排序法是对h(chng)排序法的一U改q,
基本思想是通过一排序将待排序纪录分割成独立的两部分Q其中一部分U录的关键字
均比另一部分U录的关键字,则可以分别对q两部分U录l箋q行排序Q以辑ֈ整个序列有序?br />旉复杂度ؓ(f) O(NlogN). 

疑问Q快排的最坏时间复杂度是O(n qx )Q最好时间复杂度到底?O(Nlog2N)Q还?O(NlgN)Q?
按照“数据结构自考网”的分析应该是O(Nlog2N)Q但是《数据结构》书?77上的分析Q似乎O(Nlog2N)
和O(NlgN)都是合理的,到底是什么呢Q明天问问解婷婷吧?br />
b)在什么情况下快速排序的效果最差? {案Q输入数据逆序排列时效果最差,蜕化成冒泡   ?


不断前进的小乌龟 2007-03-07 00:28 发表评论
]]>
冒(chng)排序学习(fn)ȝhttp://www.aygfsteel.com/flysky19/articles/102043.html不断前进的小乌龟不断前进的小乌龟Mon, 05 Mar 2007 17:58:00 GMThttp://www.aygfsteel.com/flysky19/articles/102043.htmlhttp://www.aygfsteel.com/flysky19/comments/102043.htmlhttp://www.aygfsteel.com/flysky19/articles/102043.html#Feedback0http://www.aygfsteel.com/flysky19/comments/commentRss/102043.htmlhttp://www.aygfsteel.com/flysky19/services/trackbacks/102043.html阅读全文

不断前进的小乌龟 2007-03-06 01:58 发表评论
]]>
վ֩ģ壺 | | ɳ| | | «| ˻| | ̩| | | | | | | | | | | | ʯɽ| ɽ| | | ɽ| | | ƽң| | | ʯ| | | ɽ| ƽԭ| | °Ͷ| | | ũ| |