`
顺先兄是X怪盗
  • 浏览: 9010 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

hash存储之概念明晰

阅读更多

hash存储

     首先让我们来看看以下的情况:我们有一堆数据,以后我们可能要这些数据进行操作(增,删,改,查等),所以现在必须把这些数据存储起来。那么我们怎么存储?用什么方法存储之后能够高效地进行以上对数据的那些操作呢?现在就介绍一种解决方法:hash存储(散列存储)。

     以前我们可能知道的数据的存储方法有:数组,队列,链表等。有了这些为什么还需要hash存储呢?答案是:操作高效!让我们来看看以下的情况:我们有5个电话号码13834542111,13856742123,13845652909,13885234921,13886677560。如果我们用数组来存储这5个电话号码,似乎很方便,但是我们的操作是不是很高效呢?如我们得到一个电话号码,要查看它是不是已经存储在这个数组里了?就得遍历这个数组,逐个比较。如此若有多次操作就很费时了……hash就可以解决这个问题,试想我们拿到一个电话号码,经过一个算法后直接知道这个号码是不是存在多方便。

     一: hash存储原理:

              1、原始数据:需要存储的那些数据,这些数据或是因为表示的自然数太大,或是表示的自然数不连续,或者是不是自然数……

              2、用来存储数据的数组:hash存储是依靠数组和链表来实现的。

              3、实现的方法:如果有1000个数据(原始数据),我们需要开辟一个大小1000的数组来存储这些数据,实现hash存储就是想法设法让这些原始数据能够通过一个算法计算后得到一个整数,而这个整数能够表示数组的一个下标,这样我们就可以把这个原始数据存储在数组的这个下标的那个位置。

    二: 看到这里读者肯定会有疑问:

           1.原始数据和下标的区别是什么?

 

            答:原始数据是杂乱无章的最初的数据,如果不经过处理无法实现高效操作的;下标是原始数据处理后的结果,对原始数据处理得到下标的目的是使对原始数据的操作能够有章可依,有法可寻从而达到高效操作。

 

           2.会不会有几个原始数据通过计算后得到同一个下标呢?

 

             答:这种情况是存在的,因为原始数据是庞大的,杂乱无章的,不定的,所以我们无法找到一个算法使所有的原始数据通过计算后和得到的下标一一对应。这种现象叫做冲突。

 

           3.这个算法是什么呢?

    

              答:对于不同的原始数据,不同的程序操作者,算法是不定的。于是就有了算法选择的一些原则。如:a.算法能够使原始数据经过计算后能够得到尽量多的不同的下标;b.算法要尽量简单,最好是看到原始数据后就可以直接得到计算后的结果(下标);

 

三:冲突处理

     所谓的冲突处理就是怎样处理两个或者是几个原始数据通过计算后得到同一个下标的问题,最直接的思想是:我们可以对这些冲突的数进行处理。如:可以把第一个得到此下标存储的那个数据作为一个链表的结点,然后把所有得到这个下标的数建立一个链表,这样在对这些数据的一个进行操作时,第一步是很快的找到数组的这个下标位置,然后就是将这个数和这个下标对应的链表里的数进行比较,从而达到对这个数的操作。当然链表不能太长了,如果太长就要对数据进行另外的处理。

 

四:实际例子

      由于种种原因,实际例子放到下一篇博客:hash存储之实际例子解析

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics