面试问题比较复杂,所以我将其简化为
A,B
您应该在c / c ++中提供两个函数
数据结构和算法取决于您。
要求
请记住,我们可能会拨打1亿次
有什么想法吗?我没有给出一个好的答案
我的回答不完整:
typedef data {
unsigned long long A;
char *B;
data *next;
}
set只是malloc一个新数据并附加到列表
但未能参与。
答案 0 :(得分:3)
我用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
变量释放内存除外。
<强>更新即可。将node
声明为数组(由HolyBlackCat建议)。
<强>更新即可。提高算法速度(建议Serge Rogatch)
答案 1 :(得分:0)
作为面试问题,考虑编码目标的影响是合理的。
考虑
巨大的数组char *even[18446744073709551615u/2+1]; char *odd[18446744073709551615u/2+1];
要求“设置应为O(1),get应为O(1)”将哈希解决方案放在一边,因为它不是真正的O(1)。哈希可以具有出色的平均速度和资源等级。
然而,没有内存效率要求,也没有内存限制,也没有设置大小(除了隐含的<1亿之外)。
#3(阵列)的天真实现肯定会超过实际内存预算,但理论上它是O(1)。仍然不是真正的候选人,即使它符合规定的要求和内存限制(理论上无界限)。
Trie的问题是它的底部叶子通常是各种各样的NULL
指针 - 这使得这种方法占用大量内存。然而,如果设定数(未知)很小,这不是一个问题。
请记住,我们可能会拨打1亿次
这一点并未反映在特里实施中,因为该提醒是也考虑了整体效率。 trie的内存效率非常低,设置数较高,平均而言比动态散列慢 - 即使使用O(1)get / set也是如此。
这是面试部分不仅提供满足要求的技术解决方案,当然还有一个特里,而是提出其优势(获取/设置为O(1))及其缺点(记忆猪) ),平均速度比哈希慢。因此,确保您的客户(在这种情况下是面试官)了解其他合理的解决方案,可能更好地满足整体目标。