Algorithm 如何在固定时间内查找N大小列表中的整数?

Algorithm 如何在固定时间内查找N大小列表中的整数?,algorithm,list,constant-time,Algorithm,List,Constant Time,列表的属性: 大小必须为N,其中N是整数的数量 没有空单元格 数字可能不是完全连续的(即{23,-15,-3,1,2,6,7,8,15100}) 插入/查找需要在固定时间内进行 我的第一反应是使用哈希表,但这会创建未使用的单元格,其中数字会被跳过 如果列表中存在一个数字,是否有任何方法可以构造这样一个列表来检查常量时间 在我的评论之后,您可以使用集合,这取决于您的具体用例,您可以查看Java之类的东西,或者如果您需要维护订单,根据文档,订单应该是固定时间: 与HashSet一样,它为基本类提供了

列表的属性:

  • 大小必须为N,其中N是整数的数量

  • 没有空单元格

  • 数字可能不是完全连续的(即{23,-15,-3,1,2,6,7,8,15100})

  • 插入/查找需要在固定时间内进行

  • 我的第一反应是使用哈希表,但这会创建未使用的单元格,其中数字会被跳过


    如果列表中存在一个数字,是否有任何方法可以构造这样一个列表来检查常量时间

    在我的评论之后,您可以使用
    集合
    ,这取决于您的具体用例,您可以查看Java之类的东西,或者如果您需要维护订单,根据文档,订单应该是固定时间:

    与HashSet一样,它为基本类提供了恒定的时间性能 操作(添加、包含和删除),假设使用哈希函数 将元素适当分散在桶中


    如果您正在其他平台上寻找解决方案,可能会有等效的实现,或者您可以检查Java的源代码并自己实现。

    您是否可以使用元素向量,例如
    V[i+k]=j
    ,例如
    L[j]=i
    ,其中k是一些起始偏移量,V和L分别是您的向量和列表?这看起来像是作弊,因为它在技术上基本上绕过了要求2。您需要保留订单吗?如果您不需要订单,
    集合
    将起作用。即使这样,您也可以使用类似于Java的
    LinkedHashSet
    Codie的东西:向量的想法听起来似乎有道理,需要进一步研究。Mateusz:我忘了说插入和查找需要固定时间,但log n插入并不是那么糟糕,这可能是我目前最好的选择。@OneEyed well
    LinkedHashSet
    应该提供固定时间的插入、查找和删除。不确定您是否在寻找特定于平台的解决方案,但您可以检查该平台是否具有等效的数据结构,或者只检查Java的源代码并自己实现它“无浪费空间”是一个非常不适定的约束。还有,我们应该如何为大小字段留出空间?对于一个空的数据结构,几乎不可能将大小降到0。哈希表的复杂性是O(1),从摊销时间看,而不是从单个操作看。在最坏的情况下,哈希表有O(N)。@LukaRahne你能扩展吗?如果发生冲突,哈希表的最坏情况是O(n)复杂度,这是真的,但我看不出会是O(n^2)复杂度?这并不是真正的摊销时间,只是当您遇到很多冲突时,您会将每个bucket降级为一个列表,或者您需要将条目重新刷新N次。此外,我们在这里讨论的是数字,所以即使我们有重复的数字,这也不适用,因为我们不会有多个具有相同哈希代码的条目。相反,我们可以构造这样的操作集,进行N(插入/删除/查找)操作将导致O(N^2)时间。@LukaRahne只有在存在哈希冲突且可能存在重复的情况下才会这样。在这里,我们对数字进行操作,因此同一哈希代码不会有多个值。在这种情况下,如果您在moderen系统上使用整数,则需要分配64*2^64位内存,以避免冲突。