好的,所以我知道这已被无数次询问,因为我用各种形式搜索但无法得到答案。
我有一个数组说A = {10,9,6,11,22}。我必须找到大于11的元素数。
我知道这可以使用修改后的二进制搜索来完成,但我需要在O(1)时间内完成。这可能吗?
(请记住,我们将元素作为输入,因此可能在进行输入时可以进行一些预计算。)
答案 0 :(得分:1)
从阵列中删除所有0并计算它们。现在您知道输入0的结果:n - count。然后从数组中的所有剩余元素中减去1。此步骤的目标是使数字的范围为[0,999999999]。如果输入大于0,则从中减去一个,否则立即返回结果。
对数字进行排序,并将其视为9位数字符串(填充前导0)。
构建树。每个节点代表一个数字。每个叶子必须存储大于其自身的数量。我认为节点数量不会太高。对于最大n = 10 ^ 5,我们可以得到大约5 * 10 ^ 5个节点(10 ^ 5个不同的前缀将我们降低到大约5级,之后我们必须将链表放到叶子上10 ^ 5现有+ 4 * 10 ^ 5表示链接列表。
现在您必须遍历所有非叶子节点,并且子节点中的所有缺失数字都会创建指向下一个较小叶子的直接链接。如果您将链接表示为与下一个下层叶子具有相同计数的叶子,则关于另外9 * 4 * 10 ^ 5个节点。
我认为现在你理论上可以得到O(1),因为请求的复杂性不依赖于n,你必须比创建哈希映射时节省更多。对于最坏的情况,你必须关闭9个节点,这是一个独立于n的常量。
答案 1 :(得分:1)
您可能还会考虑首先对输入进行排序,然后将其插入Y-fast trie(https://en.wikipedia.org/wiki/Y-fast_trie),其中每个元素也将指向其在排序输入中的索引,从而更多元素的数量并低于它。 Y-fast尝试使用O(log log M)
空格在O(n)
时间内支持后继和前任查找,其中M
是范围。
答案 2 :(得分:0)
这个答案假设建立数据结构本身不一定是恒定时间,而只是检索部分。
您可以遍历数组并构建二叉树。除了数值之外,该树中的每个节点还包含两个以上的数据点。这些点将是每个节点都大于和小于的元素数。插入逻辑会很棘手,因为需要保持这种状态。
在插入期间,在更新每个节点的计数器时,我们还可以维护按值索引的哈希映射。键将是数组中的数字,值可以是一个包装器,其中包含此数字大于且小于的元素数。由于哈希图的查找时间为O(1)
,因此可满足您的要求。
如果您需要O(1)
查询时间,则只会想到一个hashmap作为选项。请注意,遍历二叉树(即使是平衡的)通常仍然是lg(N)
操作。这可能非常快,但仍然不稳定。
答案 3 :(得分:0)
降低时间复杂度的唯一方法是增加空间复杂度。
如果您有一系列数组元素限制,让我们说[-R1,R2],那么您可以在此范围内构建一个指向链表的散列图。您可以预先计算此hashMap,然后将结果返回到o(1)。