Algorithm a「;“分而治之”;算法分配

Algorithm a「;“分而治之”;算法分配,algorithm,divide-and-conquer,Algorithm,Divide And Conquer,现在我有了N个不同的整数,我需要找到一个区间,它的值在O(NlogN)时间内在区间的端点之间的数值最多。我称之为“分而治之”的问题,因为它在我期末考试的“分而治之”类别中。我已经思考了两周,做了很多实验,没有一个是正确的(与蛮力算法相比)。有人能帮我吗 示例: 8,1,3,4,7。答案是1-7 2,6,5,4,9,8。答案是2-9或2-8 我认为“间隔”这个词不能表达我的意思。我的意思是找到数组的一个子序列,该子序列具有最多的数字,其值位于子序列的端点之间。例1:“1,3,4,7”有两个数字(3

现在我有了N个不同的整数,我需要找到一个区间,它的值在O(NlogN)时间内在区间的端点之间的数值最多。我称之为“分而治之”的问题,因为它在我期末考试的“分而治之”类别中。我已经思考了两周,做了很多实验,没有一个是正确的(与蛮力算法相比)。有人能帮我吗

示例:

8,1,3,4,7。答案是1-7

2,6,5,4,9,8。答案是2-9或2-8

我认为“间隔”这个词不能表达我的意思。我的意思是找到数组的一个子序列,该子序列具有最多的数字,其值位于子序列的端点之间。例1:“1,3,4,7”有两个数字(3,4),例2:“2,6,5,4,9”和“2,6,5,4,9,8”都有三个数字(6,5,4)

这是我的代码(O(n^2))@沃恩·卡托,我用它来和你的代码进行比较

#! /usr/bin/env python
#coding=utf-8
import itertools
def n2(numbers):
  a = [0]*len(numbers)
  ans = -1
  l = 0
  r = 0
  for j in range(1,len(numbers)):
    t = 0
      for i in range(j-1,-1,-1):
        if numbers[i]<numbers[j]:
          x = t - a[i]
          if x>ans:
            ans = x
            l = i
            r = j
          t += 1
        else:
          a[i] += 1
  return (numbers[l],numbers[r],ans)

def countBetween(numbers,left,right):
  cnt = 0
  for i in range(left+1,right):
    if numbers[left]<numbers[i]<numbers[right]:
      cnt += 1
  return cnt

for numbers in itertools.permutations(range(5)):
  ans1=n2(numbers)
  ans2=longestInterval(numbers)
if(ans1[2]!=ans2[2]):
  print ans1,ans2,numbers
#/usr/bin/env python
#编码=utf-8
进口itertools
def n2(编号):
a=[0]*len(数字)
ans=-1
l=0
r=0
对于范围(1,len(数字))内的j:
t=0
对于范围(j-1,-1,-1)内的i:
如果数字[i]是:
ans=x
l=i
r=j
t+=1
其他:
a[i]+=1
返回(数字[l]、数字[r]、ans)
def countBetween(数字、左、右):
cnt=0
对于范围内的i(左+1,右):

如果数字[左]注意:这实际上不起作用,但可能会给你一些想法。

这样想:

  • X
    为数字数组
  • s
    作为子序列开始的索引
  • e
    为子序列末尾的索引

如果选择任意分区索引
p
,则最长的子序列要么穿过该分区,要么落在该分区的左侧或右侧。如果最长的子序列穿过这个分区,那么
s
可以使用分而治之的方法解决此问题,如下所示:

  • 将整数数组等分

  • 分别计算两半上的结果
    R1
    R2
    R1
    R2
    是每半的最大间隔长度,并存储起点和终点)

  • 从上半部分获取最小整数
    MIN
    ,从下半部分获取最大整数
    MAX
    ,并计算结果
    R3
    ,作为原始数组中从
    MIN
    MAX
    的距离(
    MIN
    MAX
    分别为起点和终点)

  • 作为整个问题的结果,返回
    R1
    R2
    R3
    中的最大值

  • 为什么会这样:

    最大的间隔来自三种情况中的一种:1)前半部分2)后半部分3)跨越两个半部分。因此,计算三者中的最大值可以得到最佳结果

    时间复杂性:

    解决重复问题:

    T(n) = 2T(n/2) + O(n)
    

    给出
    T(n)=O(nlogn)
    。注:如循环所示,我们解决了两个一半大小的子问题(
    2T(n/2)
    ),并在线性时间(
    O(n)
    )中找到两个一半中的最小和最大整数。

    如果你已经做了两周,你可能已经尝试了一些东西。请随时与我们分享。向我们展示您的代码、预期解决方案的问题示例,并告诉我们您没有提到的任何问题详细信息/限制。对间隔有任何限制吗?否则你可以在O(1)中输出[MIN_INT,MAX_INT]。据我所知,你的问题是找到整数列表的最小值和最大值。一个合并排序(具有O(N.log(N))复杂性)并且您已经完成了。。。我不认为这是那么简单,所以请解释清楚你的主题,但我已经简化了这个问题,所以我的代码是不明确的。我希望这些例子能解释清楚。谢谢!但我认为这种方法可能是错误的。我将你的代码与暴力代码进行了比较,发现:(1,3,4,0,2)你的代码给出了(1,2),ans是(1,4)。@amos:我同意。它假设您可以在分区的每一侧独立地找到开始索引和结束索引,但它们实际上是相互关联的。谢谢!但我想知道你是否误解了这个问题。“从上半部分获取最小整数MIN,从下半部分获取最大整数MAX,并计算结果R3,因为原始数组中从MIN到MAX的距离(MIN和MAX分别是起点和终点)”不正确。@amos我想我忽略了间隔中的整数可能不在范围内这一事实。我会保持原样,以防有人从中获得灵感。我会继续努力的。
    T(n) = 2T(n/2) + O(n)