相同长度的最长连续子列表的长度,以及子列表求和元素的奇偶校验

时间:2018-11-12 17:03:47

标签: algorithm performance optimization

给出两个列表,例如:

a = {0,1, 0,1,0 ,1}-6个元素

b = { 1,1,1 ,0}-4个元素

我需要找到:最长连续子列表的长度(由列表之一的一个连续片段组成),其长度和奇偶子列表的求和元素的长度相同。

>

在此示例中,答案是3(“ a”列表中的第3、4、5个元素和“ b”列表中的前3个元素)。

列表按固定顺序排列。列表中的值是大于或等于0的整数。

在最坏的情况下,我的复杂度约为O(n ^ 2)。这是我解决问题的方法。

  Starting with the length of the longest possible sublist (in example it is 4)
while (length > 0){
(here I use "for" loop) Finding possible parities of that length or till for at least one of the lists all parities, within some of possible sublists, are found (0 and 1)
If there are in both lists, sublists of the same parity then it is the answer; break; if not: length--; }
if there hasn't been found any answer then the answer is 0

显然,有一种更有效的方法来解决此问题,但我想都找不到能帮助我的东西。

您有什么想法吗?也许有人在这里有类似的问题,但我找不到它?如果有什么需要澄清的,请告诉我。

如果问题需要澄清而不是否决,请要求澄清。谢谢。

编辑:这是其他一些示例:

a = { 1,1,1,1,1,1,1,1,1,1 }-10个元素

b = { 0,0,0,0,0,0,0,0,0,0 }-10个元素

答案:10

a = { 0,0,0,0,0,0,0 }-7个元素

b = { 0,0,0,0,0,0,0 ,0}-8个元素

答案:7

a = { 0,0,0 ,1,0,0,0}-7个元素

b = { 0,0,0 ,0,0,0,0,0,0,0}-10个元素

答案:3

a = {0, 1、0、0、1、1、1 }-7个元素

b = { 1、1、1、0、1、0 }-6个元素

答案:6

2 个答案:

答案 0 :(得分:0)

这是部分答案和考虑的方向。假设o之间的距离(即偶数个数)是这样分布的:

| o <- 2 -> o <- 4 -> o <- 5 -> o <- 17 -> |

请注意,我们可以利用几率之间的连续块的任意组合,并根据是否包含或排除左或右奇数元素中的一个来设置其奇偶性。例如:

4 + 1 + 5 (±2) odd:
     o <- 4 -> o <- 5 -> o
  or
    [exclude] <- 4 -> o <- 5 -> [exclude]

4 + 1 + 5 (+1) even:
     [exclude] <- 4 -> o <- 5 -> o
  or
     o <- 4 -> o <- 5 -> [exclude]

但是,如果我们在两端或两端排除了奇数,则可以使用扩展到下一个奇数的范围:

[4..0] + 1 + 5 (+1) even:
  [exclude] <- 4 -> o <- 5 -> o

(+1) 4 + 1 + [0..5] even:
  o <- 4 -> o <- 5 -> [exclude]

因此,实际上,查看我们 无法实现的序列长度可能更为有用,因为这些序列的数量要小得多或可以快速调整范围。让我们看看您的一些示例:

{0, 1, 0, 1, 0, 1}
Odd-sum lengths we cannot reach: 4
Even-sum lengths we cannot reach: 2, 6

{1, 1, 1, 0}
Odd-sum lengths we cannot reach: None
Even-sum lengths we cannot reach: 4


{0, 1, 0, 0, 1, 1, 1}
Unreachable even-sum lengths: None
Unreachable odd-sum lengths: 7

{1, 1, 1, 0, 1, 0}
Unreachable even-sum lengths: None
Unreachable odd-sum lengths: 6


{0, 0, 0, 1, 0, 0, 0}
Unreachable even-sum lengths: > 3
Unreachable odd-sum lengths: None

{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
Unreachable even-sum lengths: None
Unreachable odd-sum lengths: All

答案 1 :(得分:0)

您提供的示例允许使用以下方法进行简单的O(n)解决方案。您(或某人)能否提供至少一个示例,使该方法效率低下? (因此也许可以帮助我们改善它:)

在我的其他部分回答中,我似乎认为,输入中尝试引入的多样性或随机性越多,由于缺乏或规律性,就可能很快找到最佳匹配的可能性没有可用的长度。

方法:

我们可以在O(n)时间和空间中计算奇数出现及其出现的频率列表(由这些奇偶校验开关决定)。从整个范围的每一端开始,我们可以递归折叠一侧或另一侧,通过跳到此预先计算的列表中的下一个出现位置来确定可能的范围。 (对于任何固定面,我们也可以通过将另一面平分来对范围进行二进制搜索。)

例如:

b = [1,   1,   1,   0]
l: (0,1)(1,2)(2,3)

Odd length 3-4, indexes: 0-(2..3)
Even length (collapse left):
  2-3, indexes: 1-(2..3)


a = [0, 1, 0, 1, 0, 1]
l:    (1,1) (3,2) (5,3)

Odd length 5-6, indexes: (0..1)-5
Even length (collapse right or left):
  3-5, indexes: (0..1)-(3..4)

Next odd length (collapse right or left again):
  1-3, indexes: (0..1)-(1..2)

由于我们没有长度4的匹配项,因此下一个最佳长度是3。

a = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
b = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

全场比赛。

a = [0, 0, 0, 0, 0, 0, 0]
b = [0, 0, 0, 0, 0, 0, 0, 0]

再次尝试,没有奇数长度。

a = [0, 0, 0, 1, 0, 0, 0]
b = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

小数,偶数长度的一种,在1-3范围内向右或向左折叠。

a = [0, 1, 0, 0, 1, 1, 1]
b = [1, 1, 1, 0, 1, 0]

冒险,不需要崩溃,全偶数范围立即匹配a indexes: (0..1)-6b indexes: 0-(4..5)