符号表是重要的数据结构,由编译器创建和维护,以跟踪有关各种实体(例如变量名,对象,函数名,接口等)的出现的信息。由编译器在内部收集的信息综合阶段使用分析阶段中的符号表来生成目标代码。
符号表的不同实现之间的比较:
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)。
因此,我们可以看到符号表的每个实现都是唯一的,并且有其自身的缺点。实现者可以根据其要求选择上述符号表的任何实现。