散列中的单独链接
separate chaining in hashing
我正在读Robert Sedwick关于C++中算法的书中关于哈希的内容
我们可能使用头节点来简化插入代码到有序列表中,但我们可能不想使用M个标头节点单独链接中的单个列表。事实上,我们甚至可以消除M通过列表中的第一个节点链接到列表包括表
class ST
{
struct node
{
Item item;
node* next;
node(Item x, node* t)
{ item = x; next = t; }
};
typedef node *link;
private:
link* heads;
int N, M;
Item searchR(link t, Key v)
{
if (t == 0) return nullItem;
if (t->item.key() == v) return t->item;
return searchR(t->next, v);
}
public:
ST(int maxN)
{
N = 0; M = maxN/5;
heads = new link[M];
for (int i = 0; i < M; i++) heads[i] = 0;
}
Item search(Key v)
{ return searchR(heads[hash(v, M)], v); }
void insert(Item item)
{ int i = hash(item.key(), M);
heads[i] = new node(item, heads[i]); N++; }
};
我对以上文本的两个问题作者所说的是什么意思
"我们甚至可以通过让列表中的第一个节点组成表来消除到列表的M个链接。"我们如何修改上面的代码?
"我们可能不想在单独的链接中为单个列表使用M个头节点。"这句话的意思是什么。
"我们甚至可以通过让列表中的第一个节点组成表来消除到列表的M个链接。"
考虑Node* x[n]
与Node x[n]
:前者需要为每个非空元素的头Node
分配额外的指针和插入内存,以及为每个哈希表操作分配额外的间接性,而后者消除了n
指针,但要求任何未使用的元素将能够被置于某种可辨别的未使用状态(其跟踪可能需要或可能不需要额外的存储器),并且如果sizeof(Node)
大小大于sizeof(Node*)
,则无论如何都可能更浪费存储器。内存使用的差异也会影响缓存使用的效率:如果表的元素与桶的比率很高,那么Node[]
会将Node数据放入更少的连续内存页中,如果你正在迭代(按未排序的顺序),那么它的缓存效率非常高,而Node*[]
将跳转到可能到处都是的单独的内存分配(或者另一方面,在一些实际有用的情况下,可能实际上非常接近:例如,如果访问模式和动态内存分配地址都与对象创建的时间相关
我们如何修改上面的代码?
首先,您现有的代码有一个问题:heads[i] = new node(item, heads[i]);
覆盖哈希表中的一个条目,而不首先检查它是否为空。。。如果有任何内容,那么您应该添加到列表中,而不是覆盖数组。
设计变更讨论需求:
link* heads;
更改为…
node* head;
你可以这样初始化:
head = new node[M];
它需要一个额外的node
构造函数(如果item
有一个等效的默认构造函数,你可以在下面省略它的初始化)
node() : item(nullItem), next(nullptr) { }
然后,对代码的其余部分进行一些易于处理的连锁更改。基本上,你要去掉一层指针。
"我们可能不想在单独的链接中为单个列表使用M个头节点。"这句话的意思是什么。
我没有写它,所以不能权威地说,但它似乎是在说,在设计列表代码时,即使在空列表中,也可能会决定有一个初始节点,因为这简化了几个列表操作的代码。虽然在考虑列表的"常规"使用时,额外的无数据节点似乎是一个合理的价格,但哈希表是不寻常的,因为你希望由桶组成的大多数列表都有0或1个元素,而指数级的更少应该越来越长。因此,这样的列表实现不太适合在哈希表中使用。
- 单独库中的类成员函数定义和链接依赖项
- 在 h 和 cpp 文件中单独声明和实现模板有时有效,有时会出现链接器错误
- cmake cuda在Windows上单独的编译静态LIB链接错误,但在Ubuntu上没有
- 迭代器关系运算符出错(带单独链接和迭代器的自定义哈希表)
- cmake链接了boost/cmake的多个版本的源文件的单独汇编
- 当我单独编译并链接时,函数的性能为什么会有所不同
- 无法从单独的.cpp使用模板化成员编译/链接类
- 如何通过运算符重载连接两个单独链接的列表
- 在两个单独的 cpp 文件中定义的内联函数是否可以在链接期间创建重复的符号
- 将错误与C++单独的头文件中定义的模板类和嵌套类链接
- 初始化哈希表的 stl 列表动态数组(单独链接)
- 如何在静态库中的单独 cpp 文件中链接未引用的变量
- 将值添加到单独链接的哈希表C++
- 在C++中正确地执行单独的链接
- 哈希表单独链接中没有用于调用xxx的匹配函数
- C++:链接器错误:未定义的引用仅指向在单独文件中定义的一个特定类成员
- 单独的编译单元与单一的编译单元相比,可以更快地编译、链接和优化代码
- 是否有一种方法将我的GCL Lisp文件与Windows上的单独c++程序链接
- 散列中的单独链接
- 在单独的.cpp文件和生成文件链接中定义的类外部的 C++ 函数