在数据集

时间:2017-09-01 05:17:49

标签: c++ c algorithm search lookup

面试问题比较复杂,所以我将其简化为

  1. 输入数据的格式为A,B
  2. A是0到18446744073709551615之间的数字(mysql bigint)
  3. B是随机字符串
  4. 我们将提供IO部分
  5. 您应该在c / c ++中提供两个函数

    1. set(unsigend long long A,char * B)
    2. 得到(无长期长A)
    3. 数据结构和算法取决于您。

      要求

      1. set应为O(1)
      2. get应为O(1)
      3. 请记住,我们可能会拨打1亿次

        有什么想法吗?我没有给出一个好的答案

        我的回答不完整:

        typedef data {
            unsigned long long A;
            char *B;
            data *next;
        }
        

        set只是malloc一个新数据并附加到列表

        但未能参与。

2 个答案:

答案 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)

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

考虑

  1. @PaulMcKenzie

  2. 建议的哈希
  3. @Serge Rogatch提出并由@vadim_hr

  4. 回答的Trie
  5. 巨大的数组char *even[18446744073709551615u/2+1]; char *odd[18446744073709551615u/2+1];

  6. 要求“设置应为O(1),get应为O(1)”将哈希解决方案放在一边,因为它不是真正的O(1)。哈希可以具有出色的平均速度和资源等级。

    然而,没有内存效率要求,也没有内存限制,也没有设置大小(除了隐含的<1亿之外)。

    #3(阵列)的天真实现肯定会超过实际内存预算,但理论上它是O(1)。仍然不是真正的候选人,即使它符合规定的要求和内存限制(理论上无界限)。

    Trie的问题是它的底部叶子通常是各种各样的NULL指针 - 这使得这种方法占用大量内存。然而,如果设定数(未知)很小,这不是一个问题。

      

    请记住,我们可能会拨打1亿次

    这一点并未反映在特里实施中,因为该提醒是也考虑了整体效率。 trie的内存效率非常低,设置数较高,平均而言比动态散列慢 - 即使使用O(1)get / set也是如此。

    这是面试部分不仅提供满足要求的技术解决方案,当然还有一个特里,而是提出其优势(获取/设置为O(1))及其缺点(记忆猪) ),平均速度比哈希慢。因此,确保您的客户(在这种情况下是面试官)了解其他合理的解决方案,可能更好地满足整体目标。