您将获得一行中各点之间的距离列表。
例如:
返回它们出现在线上的点的排序序列,它们之间的距离为:
例如上面的输入产生: 一个< ---- 80 -----> c< ---- 20 ------> b< ---- 70 -----> d或相反的顺序(无关紧要)
这个问题叫什么?我想研究一下。
如果有人知道,那么为此实现了哪些可能的渐近运行时间?
答案 0 :(得分:4)
不确定它有名字;更正式地说,它将是:
|a-b| = 100
|c-b| = 20
|c-d| = 90
|a-d| = 170
其中|x|
代表x的absolute value
就广义系统而言,如果你有N个具有k个未知数的类型的方程,你有N个符号选择。在不失一般性的情况下(因为任何解决方案产生具有反向排序的第二解决方案),您可以选择第一个方程的符号,以及其中一个未知数的特定值(因为整个事物可以左右滑动到位)。然后你有剩余方程的2 N-1 可能性,你所要做的就是通过它们看看哪些有解决方案。因为系数都是+/- 1并且每个方程都有2个未知数,所以你只需逐个浏览它们:
Step 1: Without loss of generality,
choose a sign for one equation
and pick a value for one unknown:
a-b = 100, a = 0
Step 2: Choose signs for the remaining absolute values.
a = 0
a-b = 100
c-b = 20
c-d = 90
a-d = 170
Step 3: go through them one by one to solve / verify there aren't conflicts
(time = N steps).
0-b = 100 => b = -100
c-b = 20 => c = -80
c-d = 90 => d = -170
a-d = 170 => OK => (0,-100,-80,-170) is a solution
Step 4: if this doesn't work, go back through the possible choices of sign
and try again, starting at step 2.
Full set of solutions is (0,-100,-80,-170)
and its negation (0,100,80,170) and any number x<sub>0</sub> added to all terms.
因此运行时的上限是O(N * 2 N-1 )≡O(N * 2 N )。
我想可能会有一条捷径,但没有明显的想法。
答案 1 :(得分:2)
如上所述,您的问题只是一个非线性方程组(用绝对值或二次方程表示)。然而,它看起来类似于寻找哥伦布统治者或完美统治者的问题。
如果您将约束视为二次方程,例如。 (a-b)^ 2 = 100 ^ 2,那么你可以将其表述为二次规划问题,并使用一些经过充分研究的技术来解决这类问题。
答案 2 :(得分:1)
考虑到每个细分X[i] -> X[i+1]
方向的符号,它变为boolean satisfiability problem。我看不出明显的简化。运行时为O(2 ^ N) - 特别是2 ^(N-2)次测试,N值和O(1)表达式进行测试。
假设a = 0
并确定a -> b
的方向:
a = 0
b = 100
c = b + 20 X[0] = 100 + 20 X[0]
d = c + 90 X[1] = 100 + 20 X[0] + 90 X[1]
test d == 170
其中X[i]
为+1或-1。
虽然d的表达式似乎需要O(N)运算((N-2)次乘法和(N-2)次加法),但通过使用Gray code或其他此类机制来改变仅状态一次X
一次,因此每次测试的成本可以是O(1)。 (虽然N = 4可能不值得)
如果你有更多的约束而不是积分可能会出现简化 - 如果给你|b-d| == 70
,那么你只需要测试两个而不是四个 - 基本上b,c和d成为他们自己完全约束的子问题
三角属性
也可能会产生简化 所有a,b和c的 | |a-b| - |b-c| | <= |a-c| <= |a-b| + |b-c|
。
因此,如果您有多个点,并且您知道在给定对X进行分配的情况下,点之间的距离总计达到某个点,并且该总数远离目标值而不是总距离之间的距离。剩余的点数,你可以推断出没有剩下的点的任务组合将起作用。
答案 3 :(得分:0)
...代数
或者它可能是旅行商问题的简化
答案 4 :(得分:0)
我没有方便的算法书,但这听起来像路径受约束的graph search problem。您可以使用Dijkstra's Algorithm或其中的某些变体。