考虑以下问题:
输入:两个数组和的长度为,其中按排序顺序。
查询:做和包含相同的项目(与它们的多样性)?
解决此问题最快的确定性算法是什么?
能比排序更快解决吗?这个问题可以在确定的线性时间内解决吗?
考虑以下问题:
输入:两个数组和的长度为,其中按排序顺序。
查询:做和包含相同的项目(与它们的多样性)?
解决此问题最快的确定性算法是什么?
能比排序更快解决吗?这个问题可以在确定的线性时间内解决吗?
Answers:
您尚未指定计算模型,因此我将假设为比较模型。
考虑其中阵列的特殊情况下从列表中取出 { 1 ,2 } × { 3 ,4 } × ⋯ × { 2 Ñ - 1 ,2 Ñ } 。 换句话说,第i个元素是2 i − 1或2 i。
我声称,如果该算法得出的结论是和B包含相同的元素,则该算法已将B中的每个元素与其在A中的对应元素进行了比较。确实,假设算法得出的结论是A和B包含相同的元素,但从未将B的第一个元素与其A中的对应元素进行比较。如果我们切换第一个元素,则算法将以完全相同的方式进行,即使答案不同。这表明算法必须将第一个元素(和任何其他元素)与其在A中的对应元素进行比较。
这意味着,如果和B包含相同的元素,则在验证了这一点之后,算法便知道A的排序顺序。因此,它必须至少具有n !不同的叶子,因此需要时间Ω (n log n )。
这个答案考虑了一个不同的计算模型:单位成本RAM模型。在此模型中,机器字的大小为,对其进行的操作需要O (1 )时间。为了简单起见,我们还假设每个数组元素都适合一个机器字(因此,大小最多为n O (1 ))。
我们将构建一个单边误差的线性时间随机算法(即使不是这种情况,该算法也可能会声明两个数组包含相同的元素),这是确定两个数组是否更困难的问题。n和b 1,… ,b n包含相同的元素。(我们不需要对它们中的任何一个进行排序。)我们的算法将以最大1 / n的概率产生错误。
这个想法是,下面的身份保持当且仅当阵列包含相同的元素: 准确地计算这些多项式将花费太多时间。相反,我们选择一个随机素数p和随机X 0和测试是否 ñ Π我= 1(X 0 - 一个我)≡ ñ Π
总之,如果我们在至少n 2个不同素数的集合中选择大小约为n 2的随机以及x 0模p的随机数,那么当数组不包含相同元素时,我们的测试将失败概率1 - O (1 / n )。由于p符合恒定数量的机器字,因此运行测试需要时间O (n )。
使用多项式时间素数测试,并且由于大小约为的素数的密度为Ω (1 / log n ),因此我们可以选择时间上随机的素数p (log n )O (1 )。选择随机x 0模p可以通过多种方式实现,并且变得更容易,因为在我们的情况下,我们不需要完全均匀的随机x 0。
总之,我们的算法在时间运行,如果数组包含相同的元素,则始终输出YES,如果数组不包含相同的元素,则以1 - O (1 / n )的概率输出NO 。对于任何常数C,我们都可以将错误概率提高到1 - O (1 / n C)。
我将提出另一种算法(或至少是这种算法的一种方案)
该方案假定值(假定为“ 整数 ”)在[ m i n ,m a x ]之间的(狭窄?)范围内。
在时间扫描两个数组时,我们可以找到两个的和值以及它们的多重性,如果它们不同,则这两个数组不是彼此置换的min
max
min
从两个数组的所有值中减去(此处未考虑一个数组已经按排序顺序排列的事实,想必可以对此进行改进)
假设数组中的值代表质量,我们对大小为每个应用加速度/速度(在某些情况下,可以将大小提高为c > 1)
移动质量直到达到最大值max-min
,复杂度为。这样就可以找到相同的值和它们的多重性,如果它们不同,则数组不是彼此置换。否则,确定数组是彼此置换的。
注意,在许多实际情况下,上述算法方案可以(确定性地)非常快。
上面的算法方案是采用“ 运动质量 ” 的线性时间排序算法的变体。“ 移动质量 ”排序算法背后的物理直觉是:
假设每个项目的值实际上代表其质量大小,并想象将所有项目排列成一条线并施加相同的加速力。
然后,每个项目将向上移动到与其质量相关的距离,而质量会减小,而反之亦然。然后,要检索已排序的项目,只需按行进距离的相反顺序收集项目即可。
在这方面,上述算法类似于基于数字的排序算法(例如,基数排序,计数排序)
可能有人认为这种算法可能意义不大,但它至少显示出一件事。从根本上说,从根本上说,“ 基本性 ”对任意数字进行排序是项数线性时间运算。