在数据集中找到整数的最快方法

fastest way to find an integer in a dataset

本文关键字:方法 整数 数据 数据集 集中      更新时间:2023-10-16

面试问题更为复杂,因此我将其简化为

  1. 输入数据将以A,B的格式
  2. a是0至184至184467444073709551615(mysql bigint)
  3. 之间的数字
  4. b是一个随机字符串
  5. 我们将提供IO Part

您应该在C/C

中提供两个功能
  1. set(无效的长a,char *b)
  2. 获取(无效的长长a)

数据结构和算法取决于您。

要求

  1. 集应为o(1)
  2. 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的建议)

作为面试问题,考虑编码目标的影响是合理的。

考虑

  1. 哈希建议@paulmckenzie

  2. @Serge Rogatch建议的Trie,由@vadim_hr

  3. 回答
  4. 巨大数组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其他合理解决方案,可以更好地满足总体目标。