Algorithm 设计小型可比对象

Algorithm 设计小型可比对象,algorithm,memory,comparison,numbers,Algorithm,Memory,Comparison,Numbers,简介 假设您有一个键/值对列表: (0,a) (1,b) (2,c) 您有一个函数,它在两个当前对之间插入一个新值,您需要给它一个保持顺序的键: (0,a) (0.5,z) (1,b) (2,c) 这里,选择新的关键点作为边界对关键点平均值之间的平均值 问题是,您的列表可能有数以百万计的插入。如果这些插入都放得很近,您可能会得到诸如to2^(-1000000)之类的键,这些键不容易存储在任何标准或特殊的数字类中 问题 如何设计一个生成密钥的系统: 与所有其他关键点进行比较时,给出正确的结果

简介

假设您有一个键/值对列表:

(0,a) (1,b) (2,c)
您有一个函数,它在两个当前对之间插入一个新值,您需要给它一个保持顺序的键:

(0,a) (0.5,z) (1,b) (2,c)
这里,选择新的关键点作为边界对关键点平均值之间的平均值

问题是,您的列表可能有数以百万计的插入。如果这些插入都放得很近,您可能会得到诸如to
2^(-1000000)
之类的键,这些键不容易存储在任何标准或特殊的数字类中

问题

如何设计一个生成密钥的系统:

  • 与所有其他关键点进行比较时,给出正确的结果(大于/小于)
  • 仅占用
    O(logn)
    内存(其中n是列表中的项目数)
我的尝试

  • 首先,我尝试了不同的数字课程。像分数,甚至多项式,但我总能找到这样的例子,键的大小会随着插入的数量线性增长
  • 然后我考虑保存指向许多其他键的指针,并保存lower/greater than关系,但这始终需要至少
    O(sqrt)
    内存和时间进行比较

额外信息:理想情况下,当配对从列表中删除时,算法不应该中断。

我同意斯诺洛德的观点。在这种情况下,一棵树将是理想的选择。一棵红黑相间的树可以防止事物变得不平衡。但是,如果您真的需要键,我敢肯定,使用需要插入的值两边的键的平均值是最好的。这将使密钥长度每次增加1位。我建议定期重新规范化密钥。每插入一次x,或者当您检测到生成的关键点太近时,将所有关键点重新编号,从1到n

编辑:
如果按位置插入而不是按键插入,则不需要比较键。红黑树的compare函数只使用概念列表中的顺序,它与树中的顺序对齐。如果要在列表中的位置4插入节点,请在树中的位置4插入节点(按顺序使用)。如果在某个节点(例如“a”)之后插入,则是相同的。如果您使用的任何语言/库都需要密钥,那么您可能必须使用自己的实现。

我认为在操作过程中,如果不重新分配密钥,您无法避免获取大小为O(n)的密钥

作为一个实际的解决方案,我将构建一个反向搜索树,其中包含从子级到父级的指针,其中每个指针都被标记为来自左或右子级。要比较两个元素,您需要找到最接近的共同祖先,在那里元素的路径是不同的


重新分配关键点就是重新平衡树,你可以通过一些不改变顺序的旋转来做到这一点。

也许你应该用树来代替?你希望占用多少O(logn)内存--每个键值还是整个键值集?@snowlord实际上,键值对存储在树中。但是对于我正在解决的任务,我需要能够在树中的特定位置插入@HPM每个键错误。。。怎么用?想解释一下吗?在红黑树中插入的比较函数是什么?@白痴:如果你想了解更多关于红黑树的信息,可以在维基百科上阅读,但有一句有趣的话是“它可以在O(logn)时间内搜索、插入和删除”。红黑相间的树:@snowlord!我知道什么是红黑树。关键是,对于使用红黑树,您需要已经定义一个比较函数,该函数可以比较任意两个给定元素,以确定插入新元素时采用树的哪个分支。看来你有完全不同的想法-直到你编辑你的帖子,明确你打算如何使用红黑树。哦,对不起,这不是斯诺洛德的答案,但投票结果仍然有效。我认为否决票有点苛刻,因为你认为我的答案不够清楚。这不应该保留给垃圾邮件、虐待或卑鄙的愚蠢行为吗?所以你认为我应该保留一个树和一个列表,这样树就可以检查列表的顺序了?但是在列表中插入或查找会花费很长时间..啊对。钥匙实际上是为了在重新平衡时锁定订单而设计的。也许相反,我应该专注于一个更聪明的轮换方案。