来自sedgewick course,我了解到了,
符号表
符号表是
key
-value
对抽象其中,给定
key
,搜索相应的value
。如果
value
不为空get()
不存在,
key
将返回null
put()
用新值覆盖旧值。
在引入符号表抽象之后,不确定,为什么术语 Dictionary 抽象& 地图抽象介绍?堆栈溢出会维护这些标记。
使用List
实现的符号表表示,
typedef struct{
void **array;
int size;
}List;
typedef struct{
void *key;
void *value; // cannot be null
}Pair;
typedef struct ST{
List *keyValuePairList;
}ST;
从wiki,我了解到了,
Set 是一种抽象数据类型,可以存储某些值,没有任何特定顺序,也没有重复值。它是有限集的数学概念的计算机实现。
从wiki定义的设置,我得出结论,
设置是一个包含不同项目的抽象,
其中,每个项目都有
key
,维护相应的
value
并未违反设置属性如果
value
可以为null,get()
不存在,如果
key
将返回null,put()
不为空,
value
会使用新值覆盖旧值。
从操作&数据方面,设置和符号表看起来类似。很难理解什么时候使用什么?
使用List
实施设置表示,
typedef struct{
void **array;
int size;
}List;
typedef struct{
void *key;
void *value; // can be null
}Pair;
typedef struct{
List *keyValuePairList;
}Set;
问题:
是put()
操作区分设置和符号表?我仍然看到这两个是相同的。
答案 0 :(得分:2)
符号表通常是编译器和链接器中用于将符号与地址相关联的(哈希)符号表(或任何其他面向键/值的数据结构)。
该术语通常不用作通用数据结构的表示法。
您或该课程的制作者搞砸了通用数据结构之间的术语(例如"哈希表","地图",& #34;字典"它们是存储按键排序和访问的值的数据结构的所有备用名称)和通用数据结构的特定应用程序("符号表&#34 ;)用于存储与名称相关的地址的编译器和链接器技术。
答案 1 :(得分:2)
Set只存储值,而不是键值对。
本课程描述的符号表通常称为地图。使用"符号表"是不合适的。作为抽象的名称,因为它可能没有以表格方式实现,也可能不存储符号。
因此,Set和Map之间的区别在于Map将键映射到值,并且可以查找与键对应的值,而Set只存储值,并且只能 test 是否价值本身。虽然Set可以通过使用Map并将每个要插入的元素映射到自身来实现,或者如您所建议的那样为null。
具有单独的Set抽象的目的是向其他程序员发信号通知映射不重要,并抽象出" dummy"值(值的空值或副本),这可以节省输入并减少程序员的认知负担。