【发布时间】:2014-02-06 06:50:33
【问题描述】:
这个问题被否定了,因为队形不好。请重新阅读,我试图改进它。
对于上述问题,我找到了以下答案:
"考虑一个由哈希表 H 和数组 A 组成的数据结构。 哈希表键是数据结构中的元素,而 values 是它们在数组中的位置。”
insert(value):
- 将值追加到数组
A - 让
i成为 A 中的索引。 - 设置
H[value] = i。
remove(value): Replace the cell that containsvaluein 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;
}
【问题讨论】:
-
因为您实际上从未使用 remove 函数删除元素,所以您的 randomselection 方法将返回数组中的最后一个元素,而不是任何其他元素
-
能否详细解释一下?
-
请不要再否定这个问题了,没有人会因为它而试图给出答案..
-
我猜人们没有回答这个问题,因为它不是很好。它做错了什么?你做了什么来让它正常工作——你是在调试器中运行它还是尝试添加打印输出来查看变量是如何变化的?您能否将问题缩小到比“请检查并重写我的代码”更具体的问题? (他们拒绝投票的事实可能是相同问题的结果,而不是导致响应减少的原因。)并且为了记录,我不是否决了它。
-
@keshlam,我已经改进了,请重新阅读,如果有任何进一步的改进,请告诉我