📜  符号表的各种实现

📅  最后修改于: 2021-09-27 15:35:15             🧑  作者: Mango

符号表是一种重要的数据结构,由编译器创建和维护,用于跟踪变量名、对象、函数名、接口等各种实体的出现信息。 编译器内部收集的信息分析阶段的符号表被综合阶段用来生成目标代码。

符号表不同实现的比较:

1. 数组(已排序):

  • 插入时间 –
    插入元素时,必须完成遍历才能将元素向右移动。因此,它需要 O(n) 时间。
  • 查找时间 –
    查找时可以使用二分搜索来查找元素。因此,它需要 O(log n) 时间。

2. 链表:

  • 插入时间 –
    类似于这里的数组,为了查找插入元素的位置需要遍历。因此,它需要 O(n) 时间。
  • 查找时间 –
    在获取数据项时,必须完全遍历链表(线性搜索)。因此,此操作需要 O(n) 时间。

3. 无序列表:

  • 插入时间 –
    在无序数组中,插入可以在开头进行,而在无序列表中,插入可以在末尾进行。因此,它需要 O(n) 时间。
  • 查找时间 –
    因为它是一个无序列表,所以必须搜索完整列表才能找到一个元素。因此,它需要 O(n) 时间。

对符号表实现使用数组、链表或未排序列表的缺点:

  • 查找时间与表大小成正比。
  • 每个插入操作之前都有查找操作。

4. 自组织名单:

  • 插入时间 –
    它通常是一个未排序的列表,因此插入一个元素所花费的时间是 O(1)。
  • 查找时间 –
    这里搜索一个元素需要先搜索一个元素,然后把它移到列表的开头,这样最常用的元素就在列表的开头。实际上,一般来说,未排序列表搜索需要 O(n) 时间。

对符号表实现使用自组织列表的缺点:
这种实现的缺点是,每当搜索频率较低的元素时,性能就会变差。

5. 搜索树(平衡):

  • 插入时间 –
    如果树中有n个元素并且树的阶为k,那么树的高度将为logkn。现在,在最坏的情况下,插入将发生在树的高度。因此,所需的时间是 O(logkn)。
  • 查找时间 –
    在平衡搜索树中,搜索所需的时间为 O(logkn)。

将搜索树用于符号表实现的缺点:
这种实现的缺点是树总是必须保持平衡。

6. 哈希:

  • 插入时间 –
    由于在哈希表中插入需要恒定的时间,因此插入所需的时间是 O(1)。
  • 查找时间 –
    在哈希表中搜索需要恒定时间,因此所需时间为 O(1)。

对符号表实现使用哈希的缺点:
这种实现的缺点是当冲突太多时,时间复杂度会增加到 O(n)。

因此,我们可以看到符号表的每个实现都是唯一的,并且都有其自身的缺点。实现者可以根据自己的需要选择上述符号表的任意一种实现方式。