Sqlite中hash表解析

原创 2017年01月03日 22:07:11


Hash表,是一个十分常见的存储结构,是字典存储的主要实现方式。相比链表,hash表的搜索性能十分优越,理论上可以达到O(1)的时间复杂度。所以hash表基本是超大型的字典的唯一选择吗,不过hash表也存在内存占用较大的缺点,即便表中一个有效数据都没有,都要占用一个不小的初始空间。

 

Sqlite是一个轻量级数据库,能够运行在大部分的嵌入式操作系统上。作为一个关系型数据库,其存储结构是一张张的表,内存组织形式是划分为一个个的pagepage是通过B树来组织的。不过sqlite中同样也用到了hash table,由官网文档的描述是parser使用的symbol tables便是hash table实现的。

文本框: ** Hash.htsize and Hash.ht may be zero.  In that case lookup is done
** by a linear search of the global list.  For small tables, the 
** Hash.ht table is never allocated because if there are few elements
** in the table, it is faster to do a linear search than to manage
** the hash table.
*/
struct Hash {
  unsigned int htsize;      /* Number of buckets in the hash table */
  unsigned int count;       /* Number of entries in this table */
  HashElem *first;          /* The first element of the array */
  struct _ht {              /* the hash table */
    int count;                 /* Number of entries with this hash */
    HashElem *chain;           /* Pointer to first entry with this hash */
  } *ht;
};
 
/* Each element in the hash table is an instance of the following 
** structure.  All elements are stored on a single doubly-linked list.
**
** Again, this structure is intended to be opaque, but it can't really
** be opaque because it is used by macros.
*/
struct HashElem {
  HashElem *next, *prev;       /* Next and previous elements in the table */
  void *data;                  /* Data associated with this element */
  const char *pKey; int nKey;  /* Key associated with this element */
};
在阅读sqlite源码hash部分的时候,发现其实现比较有趣,主要是sqlite用单个数据结果能够同时表现为hash表和链表,能够在数据量大的时候发挥hash表效率高的优点,而在数据量低的时候发挥链表节约空间的优点。

其结构体定义如上述代码所示,和普通的hash表比较,基本只是多了一个first指针。

其结构如下图所示,同样可以看到,其包含了一个常规的hash table,此外,还有一个hash表元素的指针firstHash表元素入表时,除了加入到bucket中,还会组织成为一个链表。此hash表应对冲突的方式同样是使用链表。在ht结构体,即bucket数组的每个元素中除了链表chain以外,还包含了一个count,是因为所有buckets的元素都组织成为一张链表,只有通过记录每个bucket的元素的个数才能分割各个bucket

 

除了上述可以在hash表和普通链表中灵活变换以外,其还有一个十分不错的优点,就是可以快速的遍历hash表中所有的元素,而在普通的hash表中,遍历元素则没有那么简单。另一方面,此hash表进行了相应改进获得了灵活性和遍历性能提升的同时,对hash表本身的性能并没有明显的冲击,因此,这是一个十分实用的改进。

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

全面解析Linux 内核 3.10.x - Pid hash 链表

From: 全面解析Linux 内核 3.10.x - 进程管理 不管千山万水,时间流逝,我们始终是有关系的 - 某某言情剧何谓进程之间的关系?在前面作总结的时候,说进程有一个标识ID,我们称之为进程...

十一、从头到尾解析Hash表算法

十一、从头到尾彻底解析Hash 表算法作者:July、wuliming、pkuoliver  出处:http://blog.csdn.net/v_JULY_v。  说明:本文分为三部分内容,    第...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

从头到尾彻底解析Hash 表算法

作者:July、wuliming、pkuoliver   出处:http://blog.csdn.net/v_JULY_v。   说明:本文分为三部分内容,     第一部分为一道百度面试题To...

十一、从头到尾彻底解析Hash 表算法

十一、从头到尾彻底解析Hash 表算法 作者:July、wuliming、pkuoliver   出处:http://blog.csdn.net/v_JULY_v。   说明:本文分为三...

从头到尾彻底解析Hash 表算法

十一、从头到尾彻底解析Hash 表算法 作者:July、wuliming、pkuoliver  出处:http://blog.csdn.net/v_JULY_v。   说明:本文分为三部分...

从头到尾解析Hash表算法

【转自 http://blog.csdn.net/v_JULY_v/article/details/6256463】   十一、从头到尾解析Hash 表算法 作者:July...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)