我有一套配对项目:[(a0,b0),(a1,b1),(a2,b2),...(aN,bN)]
。这些对形成一组运行。例如,可能是b4=a1
和b1=a6
,因此4,1,6
是运行。所有的a
s,和所有的b
s,都是独一无二的,所以运行永远不会含糊不清。请注意,一些运行将是长度1.排序对要更连续
我想排列这样的运行是连续的。在排列组中,对于任何j
,应该是aj=b(j+1)
或aj
不等于任何b
的情况。我不在乎排列的任何其他方面,并且运行可以以相对于彼此的任何顺序出现。
例如:设定[(5,2),(0,3),(1,0),(7,4),(6,5),(3,8)]
包含运行4,0
((6,5)
和(5,2)
)2,1,5
((1,0)
,(0,3)
,和(3,8)
),和3
。所以有效的排列是[(6,5),(5,2),(1,0),(0,3),(3,8),(7,4)]
。
显然有一个简单的O(n log n)
时间和空间O(n)
溶液:
- 排序
b
阵列对。 - 对于每一对的
a
,在阵列上执行二进制搜索以匹配b
。记录与b
不匹配的所有a
;这些将是运行的开始。 - 对
a
对数组进行排序。 - 对于每个运行起始点
a
,首先通过二进制搜索匹配a
的对,然后在a
之间通过二进制搜索该对b
等,直到运行结束。
渐近地说,这可能和我们不用散列一样好。然而从实际的角度来看,我并不完全开心。它涉及两种不同的类型和二进制搜索。这是相当麻烦的。这段代码处于一个极端的内部循环中(是的,我已经进行了剖析),并将对整个系统的性能产生重大影响。
还有什么其他的方法值得思考吗?
值的密度/紧凑程度如何,即通过使用数组索引元组会浪费多少空间? – 2014-11-24 15:47:33
@ Zim-ZamO'Pootertoot根本不紧凑。这些项目是128位或256位,但N一般不会大于30. – Sneftel 2014-11-24 15:54:06
对于30个项目,O(n^2)算法是眨眼 – 2014-11-25 18:45:11