我需要在标准库的限制内在Map
中实现C
。我只能包含<stdio.h>
和<malloc.h>
。我已经使用数组(complexity = O(N^2))
和地图密钥(complexity = O(Nlog(N))
上的BST实现了线性版本。我想知道还有其他更好的选择。我一直在寻找竞争性编程的方法,其中实施时间是一个问题。
当密钥为int
类型时,我们只需使用带value
密钥的int
数组,但当密钥属于不同类型时(例如string
或{ {1}})我们如何有效地制作这张地图。这就是我想要的。
我的线性实施:
struct
答案 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 */
}