仅使用<stdio.h>和<malloc.h>在C中实现Map

时间:2017-06-23 17:50:24

标签: c algorithm dictionary time-complexity

我需要在标准库的限制内在Map中实现C。我只能包含<stdio.h><malloc.h>。我已经使用数组(complexity = O(N^2))和地图密钥(complexity = O(Nlog(N))上的BST实现了线性版本。我想知道还有其他更好的选择。我一直在寻找竞争性编程的方法,其中实施时间是一个问题。

当密钥为int类型时,我们只需使用带value密钥的int数组,但当密钥属于不同类型时(例如string或{ {1}})我们如何有效地制作这张地图。这就是我想要的。

我的线性实施:

struct

1 个答案:

答案 0 :(得分:1)

地图ADT的最佳实现之一是哈希表,如果您具有良好的哈希函数和足够大的桶阵列,则查找是恒定时间(O(1))。有几种现有的实现方式,但如果需要,可以相当容易地实现它们。只需根据需要选择一个哈希函数,并使用类似下面的内容(WLAG,假设您的密钥是KEY类型,值类型为VALUE,哈希函数原型unsigned char hash(KEY),当且仅当两个参数为“相等”时,密钥比较函数int keykmp(KEY,KEY)才返回零[这里的哈希表有256个条目,或32位系统上的1 KiB内存开销;你可以使用更多]):< / p>

typedef struct bucket {
    KEY key
    VALUE val;
    struct bucket * next;
} bucket;

bucket * table[256];

void add(KEY key, VALUE val) {
    bucket * entry;
    unsigned char hashval = hash(key);

    if(table[hashval] == NULL) {
        entry = table[hashval] = (bucket*) malloc(sizeof(bucket);
    } else {
        entry = table[hashval];
        while(entry->next != NULL) entry = entry->next;
        entry->next = (bucket*) malloc(sizeof(bucket);
        entry = entry->next;
    }

    entry->key = key;
    entry->val = val;
    entry->next = NULL;
}

VALUE lookup(KEY key) {
    bucket * entry;

    for (entry = table[hash(key)]; entry != NULL; entry = entry->next) {
        if(keykmp(key, entry->key) == 0) return entry->value;
    }

    return NULL; /* Or whatever other error value */
}