我用C这样做过。我想你会从代码中理解我的想法。 (由nos注:这个算法被称为Trie)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct node node;
struct node {
node *nodes[0x10];
char *text;
};
node *top;
void set(unsigned long long A, char *B)
{
unsigned char n;
node *way;
way = top;
for (;A>0;A>>=4)
{
n = A & 0xf;
if (way->nodes[n] == NULL)
{
way->nodes[n] = malloc(sizeof(node));
memset(way->nodes[n], 0, sizeof(node));
}
way = way->nodes[n];
}
if (way->text != NULL)
{
free(way->text);
}
way->text = strdup(B);
}
char *get(unsigned long long A)
{
unsigned char n;
node *way;
way = top;
for (; A>0 && way != NULL; A>>=4)
{
n = A & 0xf;
way = way->nodes[n];
}
if (A == 0 && way != NULL)
{
return way->text;
}
return NULL;
}
int main()
{
top = malloc(sizeof(node));
memset(top,0,sizeof(node));
set(1230294381243, "test1");
set(12934839, "test2");
set(1,"tezt");
printf("%s", get(1230294381243));
printf("%s", get(12934839));
printf("%s", get(1));
// todo: free memory
// free_way(top);
return 0;
}
最大16次迭代找到任何unsigned long long
键。此代码是100%正常工作并进行了测试,但从top
变量中释放内存除外。
UPDATE。声明node
s作为数组(建议HolyBlackCat)。
UPDATE。提高算法速度(建议Serge Rogatch)
你的答案是什么? –
'O(1)'认为哈希。 – PaulMcKenzie
如果您知道哈希表使用哈希函数,这是一个简单的答案。 'set()'将键值设置为'A'作为键,'B'作为值,Get将使用键'A'获取'get()'值'B' ...出于好奇,你能说出什么公司这是为了什么? –