这个问题是由于不良形成所致。请重新阅读,我试图改进它。
对于上述问题,我找到了以下答案:
“考虑由哈希表H和数组A组成的数据结构。 哈希表键是数据结构中的元素,而 值是它们在数组中的位置。“
insert(value):
A
i
成为A。H[value] = i
。 remove(value): Replace the cell that contains
的值in A with the last element in A.
d
成为数组A
中的最后一个元素。i
为H[value]
,即要删除的值数组中的索引。A[i] = d
和H[d] = i
A
的大小减少一个 contains(value): return true if H contains value
value
value
value
,则返回true getRandomElement():
r = random(current size of A).
return A[r]
。我试图在C中实现相同的功能,请一些人帮我回答以下疑问并参考代码
newData应该作为HashTable调用吗?
有没有办法实现它,而不保持结构中的大小?
- 醇>
如果您要实施与之相同的设计?
#include <stdio.h>
#define MAX 100
typedef struct data
{
int A[MAX];
int size = 0;
}newData;
newData *new;
bool insert(newData *n, int value)
{
int index;
index = hash(value)/MAX;
// assume there is no LL to save extra value
if ((n->A)[index] == value)
return false;
(n->A)[index] = value;
return true;
}
bool remove(newData *n, int value)
{
int index;
index = hash(value) % MAX;
(n->A)[index] = (n->A)[n->size];
// is this following a correct way to delete the last element?
n->size--;
return true;
}
bool contains(newData *n, value)
{
int index;
index = hash(value) % MAX;
if ((n->A)[index] == value)
return true;
return false;
}
int hash(int value)
{
// assume it calculates a good hash and returns the value
}
int main()
{
return 0;
}
答案 0 :(得分:0)
首先,当你传递指针时,你会按值传递哈希表
大多数哈希表通过使用链接列表来存储散列到同一存储桶的元素来解决冲突。然后检索包括对列表的线性搜索以找到元素
此外,当您计算元素的哈希值时,您应该将该数字除以您的桶大小并取余数,这将作为元素的新位置。
除非您的哈希函数旨在返回1..100
范围内的值,否则您需要执行此操作以避免segmentation fault
错误
对于删除或删除元素,如果哈希表使用链表冲突解决方法,那么删除只会在哈希函数返回元素所在的索引后删除该元素的链接
阅读this tutorial以了解有关哈希艺术的更多信息