散列表

158 阅读3分钟

散列表(哈希表,Hash Table)不是线性结构。

  1. 线性结构的特点

    • 线性结构是指数据元素之间存在着一对一的线性关系,有且仅有一个开始节点和一个终端节点,并且除了开始节点和终端节点外,其余每个节点都有且仅有一个直接前驱和一个直接后继。例如,数组、链表、栈和队列都是线性结构。
    • 在数组中,元素通过索引形成线性关系,索引相邻的元素在逻辑上也是相邻的;链表中,节点通过指针链接,每个节点(除了头节点和尾节点外)都有一个前驱节点和一个后继节点。
  2. 散列表的结构特点

    • 散列表是根据关键码值(Key)而直接进行访问的数据结构。它通过一个散列函数(Hash Function)将关键码映射到一个特定的位置(槽位,Slot)来存储数据。
    • 散列函数将不同的关键码尽可能均匀地分布到一个固定大小的数组(桶数组,Bucket Array)中。例如,假设有一个简单的散列函数h(key)=key % size(其中size是桶数组的大小),对于关键码714,如果size = 5,那么h(7)=7 % 5 = 2h(14)=14 % 5 = 4,它们会被存储到数组的不同位置。
    • 散列表中的元素存储位置是由散列函数决定的,而不是像线性结构那样按照顺序或者线性关系存储。不同的关键码经过散列函数计算后可能会被存储在数组的不同位置,这些位置之间没有线性的先后顺序关系。
  3. 与线性结构的对比

    • 访问方式不同。在线性结构中,访问元素通常是按照顺序(如数组的索引顺序或者链表的节点链接顺序)进行的。而在散列表中,是通过计算关键码的散列值来访问元素,这个散列值直接指向元素在散列表中的存储位置。
    • 存储位置关系不同。线性结构中元素的存储位置反映了它们之间的逻辑关系,如在栈中,后入栈的元素在栈顶,靠近栈顶的元素之间存在线性的顺序关系。而在散列表中,元素的存储位置主要取决于散列函数的计算结果,两个相邻存储位置的元素在逻辑上可能没有关联。
  4. 散列表的优势

    • 散列表的主要优势是查找、插入和删除操作的平均时间复杂度可以达到 O (1)。这是因为通过散列函数可以快速定位到元素应该存储的位置。例如,在一个存储学生信息的散列表中,以学生的学号作为关键码,通过散列函数计算学号对应的存储位置,就可以快速地查找、插入或删除学生信息。相比之下,在一个线性结构(如链表)中,查找一个元素可能需要遍历整个链表,时间复杂度为 O (n)。