在数据集中找到整数的最快方法
fastest way to find an integer in a dataset
面试问题更为复杂,因此我将其简化为
- 输入数据将以
A,B
的格式 - a是0至184至184467444073709551615(mysql bigint) 之间的数字
- b是一个随机字符串
- 我们将提供IO Part
您应该在C/C
中提供两个功能- set(无效的长a,char *b)
- 获取(无效的长长a)
数据结构和算法取决于您。
要求
- 集应为o(1)
- Get应该是O(1)
请记住,我们可能会称为1亿次
有什么想法吗?我没有给出一个很好的答案
我的答案不完整:
typedef data {
unsigned long long A;
char *B;
data *next;
}
集只是malloc一个新数据,并将其附加到列表
但失败了。
我以这种方式完成了此操作。我认为您会从代码中理解我的想法。(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
s声明为一个数组(HolyblackCat的建议)。
更新。提高算法速度(Serge Rogatch的建议)
作为面试问题,考虑编码目标的影响是合理的。
考虑
-
哈希建议@paulmckenzie
-
@Serge Rogatch建议的Trie,由@vadim_hr
回答 巨大数组
char *even[18446744073709551615u/2+1]; char *odd[18446744073709551615u/2+1];
要求"设置为o(1),应为o(1)"放在哈希解决方案上,因为它不是真正的o(1)。仍然可以具有出色的平均速度和资源等级。
但是没有内存效率要求,也没有内存限制,也没有设置大小(隐含的&lt; 1亿)。
#3(阵列)的幼稚实现肯定会超过实际记忆预算,但理论上是O(1)。即使它符合所陈述的要求和内存限制(理论上无限制),但仍然不是 Real 候选人。
。 Trie的问题是其底部的叶子通常是NULL
的广泛指针 - 使此方法记忆密集型。但是,如果设置计数(未知)很小,这不是一个问题。
请记住,我们可能会称为1亿次
这一点没有反映在Trie实施中,因为该提醒是也考虑了超出效率。Trie的内存效率可能非常低,平均计数比动态哈希较慢 - 即使使用其O(1)get/set。
这是面试部分不仅提供满足要求的技术解决方案,当然是Trie,而且还提供了其优势(o(1)for Get/set)及其短路(内存猪),平均速度比哈希慢。因此,要确保您的客户(在这种情况下为访调员)是 ceply其他合理解决方案,可以更好地满足总体目标。
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 让bool方法返回其他整数
- 有没有一种优雅而快速的方法来测试整数中的 1 位是否位于连续区域
- 将一系列整数放入类的最佳方法是什么?
- 比较C++中两个整数的最有效和最干净的方法是什么?
- 在 C++ 中将整数数组转换为位集表示形式的最佳方法?
- 有没有更好的方法对C++中的三个整数进行排序?
- 使用192/256位整数求和无符号64位整数向量的点积的最快方法
- 初始化不是整数的巨大常量多维数组的最佳方法是什么?
- 在C++中,将无符号整数转换为八进制表示,反之亦然的最佳方法是什么
- C++:这是使用整数变量作为函数调用指针的正确方法吗
- 计算将整数n分解为4平方和的方法的数量
- 计算机使用什么方法添加无符号整数
- 基于整数向量执行位排列的有效方法?
- 快速方法可以将整数乘以适当的分数,而无需浮点或溢出
- 为大无符号整数分配内存的有效方法
- 在模型中保存整数的方法,与QStyledItemDelegate兼容
- 将整数输入数组的方法比 scanf() 或 cin 更快?
- 如何将枚举传递给方法而不将其作为整数传递
- 获取两个无符号整数 C++ 乘积的高 32 位的有效方法