【问题标题】:Create a data structure that has fast insertion, removal, membership testing, and random selection [closed]创建具有快速插入、删除、成员测试和随机选择的数据结构 [关闭]
【发布时间】: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中实现相同的功能,请一些人参考代码帮助我回答以下疑问

  1. 应该将 newData 称为 HashTable 吗?

  2. 有没有办法实现它,而不在结构中保持大小?

  3. 如果您要实现相同的设计,您会遵循什么设计?

#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,我已经改进了,请重新阅读,如果有任何进一步的改进,请告诉我

标签: c hash hashtable


【解决方案1】:
  • 首先,当您应该传递指向哈希表的指针时,您将按值传递哈希表

  • 大多数哈希表通过使用链表来存储哈希到同一个桶的元素来解决冲突。然后检索包括对列表进行线性搜索以找到元素

  • 此外,当您计算元素的哈希值时,您应该将该数字除以您的存储桶大小并取余数,这将作为元素的新位置。 除非您的哈希函数旨在返回 1..100 范围内的值,否则您需要这样做以避免出现 segmentation fault 错误

  • 至于删除或删除元素,如果您的哈希表使用链表冲突解决方法,那么一旦您的哈希函数返回元素应位于的索引,删除将只涉及删除指向该元素的链接

阅读this tutorial 了解更多关于散列的艺术

【讨论】:

  • 几个尼特:您的意思是“使用指针”,而不是“通过引用”。 C 中没有引用。开放式哈希表解决了与列表的冲突。封闭的哈希表没有,它们在某些应用程序中有意义。你是对的,这不是其中之一。删除很简单。
  • 好的,你能再检查一下吗?
  • 另外,请不要再否定这个问题了,不用麻烦回答了
  • @codeymodey,请注意我对代码所做的更改,其中包括将值散列到索引 index = hash(value) % MAX; 的正确方法
猜你喜欢
  • 2014-03-04
  • 1970-01-01
  • 2010-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-09
相关资源
最近更新 更多