创建一个具有快速插入,删除,成员资格测试和随机选择的数据结构

时间:2014-01-17 03:46:50

标签: c hash hashtable

这个问题是由于不良形成所致。请重新阅读,我试图改进它。

对于上述问题,我找到了以下答案:

  

“考虑由哈希表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中的最后一个元素。
  • iH[value],即要删除的值数组中的索引。
  • 设置A[i] = dH[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. 有没有办法实现它,而不保持结构中的大小?

  4.   
  5. 如果您要实施与之相同的设计?

  6.   
#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;
}

1 个答案:

答案 0 :(得分:0)

  • 首先,当你传递指针时,你会按值传递哈希表

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

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

  • 对于删除或删除元素,如果哈希表使用链表冲突解决方法,那么删除只会在哈希函数返回元素所在的索引后删除该元素的链接

阅读this tutorial以了解有关哈希艺术的更多信息