Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 给定颜色的最长序列_Algorithm_List_Binary Search - Fatal编程技术网

Algorithm 给定颜色的最长序列

Algorithm 给定颜色的最长序列,algorithm,list,binary-search,Algorithm,List,Binary Search,假设我们有一个值为黑白的元素列表。是否有O(N)算法来寻找由黑色元素组成的最长序列 我知道,使用二进制搜索,我们可以在O(Nlog(N))进行搜索。我想知道我们是否能做得更好 我觉得我可能误解了这个问题,但是:按顺序逐个查看它们?我觉得我可能误解了这个问题,但是:按顺序逐个查看它们?可以保留数组的第一个值和索引。并分配maxCount和maxIndex以保持序列最长的起始位置 Create oldValue and assign first value of array Create maxC

假设我们有一个值为黑白的元素列表。是否有O(N)算法来寻找由黑色元素组成的最长序列


我知道,使用二进制搜索,我们可以在O(Nlog(N))进行搜索。我想知道我们是否能做得更好

我觉得我可能误解了这个问题,但是:按顺序逐个查看它们?

我觉得我可能误解了这个问题,但是:按顺序逐个查看它们?

可以保留数组的第一个值和索引。并分配maxCount和maxIndex以保持序列最长的起始位置

Create oldValue and assign first value of array 
Create maxCount variable
Create maxIndex variable (it should be 0 because we use first value of array)

Move on array - start with 2nd element (because we used first already)
   if new value is equal old value
      go to next element and increase count
   else
      check if count > maxCount
         if so maxCount = count and maxIndex = i
         else count = 0 
   and oldValue = currentValue

这样做直到到达数组的末尾。也是O(N)。我不写任何代码,因为我相信你应该自己写。您可以在尝试后询问任何问题。

您可以保留数组的第一个值及其索引。并分配maxCount和maxIndex以保持序列最长的起始位置

Create oldValue and assign first value of array 
Create maxCount variable
Create maxIndex variable (it should be 0 because we use first value of array)

Move on array - start with 2nd element (because we used first already)
   if new value is equal old value
      go to next element and increase count
   else
      check if count > maxCount
         if so maxCount = count and maxIndex = i
         else count = 0 
   and oldValue = currentValue

这样做直到到达数组的末尾。也是O(N)。我不写任何代码,因为我相信你应该自己写。你可以在尝试之后问任何问题。

我认为卡丹的算法会在这个问题的最佳时间为你提供解决方案。考虑ListTimes中包含你的“黑色”和“白色”,所以对于一个例子,我们一直在跟踪有多少“黑色”的项目,我们一直在计算,如果我们遇到一个“白色”比我们把计数器重新设置为零,如果在任何时候,元素“黑色”或“白色”的计数超过了全局最大计数,然后用局部计数更新全局计数

我已经用python编写了代码,欢迎评论和编辑。我是StackOverflow(和编码)新手

此外,您可以查找它,以便更好地理解

ListItems = ['Black', 'White', 'Black', 'Black', 'White', 'White', 'White', 'White','Black','Black','Black','Black', 'White', 'White','Black', 'White', 'White','Black','Black', 'White', 'White']


maxi = 0
max_so_far = 0

for i in ListItems:
  if i =='Black':
    maxi += 1

  else:
    maxi = 0 

  if maxi > max_so_far:
    max_so_far = maxi

print(max_so_far)

我认为Kadane的算法将在这个问题的最佳时间内为您提供解决方案。考虑ListTimes中包含你的“黑色”和“白色”,所以对于一个例子,我们一直在跟踪有多少“黑色”的项目,我们一直在计算,如果我们遇到一个“白色”比我们把计数器重新设置为零,如果在任何时候,元素“黑色”或“白色”的计数超过了全局最大计数,然后用局部计数更新全局计数

我已经用python编写了代码,欢迎评论和编辑。我是StackOverflow(和编码)新手

此外,您可以查找它,以便更好地理解

ListItems = ['Black', 'White', 'Black', 'Black', 'White', 'White', 'White', 'White','Black','Black','Black','Black', 'White', 'White','Black', 'White', 'White','Black','Black', 'White', 'White']


maxi = 0
max_so_far = 0

for i in ListItems:
  if i =='Black':
    maxi += 1

  else:
    maxi = 0 

  if maxi > max_so_far:
    max_so_far = maxi

print(max_so_far)

Re:“我知道使用二进制搜索我们可以在O(Nlog(N))进行搜索”:你这是什么意思?二进制搜索是一种O(logn)算法,用于在排序数组中查找给定值。这似乎根本不适用于你的问题。你确定你正确地描述了你的问题吗?是的,这就是我要问的。谢谢你的回复。我最初的问题是在给定的列表中查找最长的递增子序列。在线可用的解决方案是O阶(Nlog(N)),但我认为通过着色参数我们可以将其简化为O(N)。仍然不理解为什么“按顺序查看它们”不是答案。只需记录你目前发现的连续黑人数量,到目前为止发现的最多的黑人数量,以及迄今为止最长的索引。当你走到最后,你将用N步走完,你就完成了。@BobVesterman:我没说这不是答案。我只是想检查我对最长递增子序列问题的理解是否正确。谢谢你的解释。我想你一定是误解了“最长增长子序列问题”。该问题允许非连续子序列;因此,对于任何给定的元素,您都无法立即判断它是否表示增加(因为在获得完整的解决方案之前,您不知道前一个元素是什么)。所以没有“着色论证”;没有合理的方法将最长递增子序列问题映射到一个问题,在这个问题中,我们可以通过查看元素来判断是否包含元素。Re:“我知道使用二进制搜索可以在O(Nlog(N))”:这是什么意思?二进制搜索是一种O(logn)算法,用于在排序数组中查找给定值。这似乎根本不适用于你的问题。你确定你正确地描述了你的问题吗?是的,这就是我要问的。谢谢你的回复。我最初的问题是在给定的列表中查找最长的递增子序列。在线可用的解决方案是O阶(Nlog(N)),但我认为通过着色参数我们可以将其简化为O(N)。仍然不理解为什么“按顺序查看它们”不是答案。只需记录你目前发现的连续黑人数量,到目前为止发现的最多的黑人数量,以及迄今为止最长的索引。当你走到最后,你将用N步走完,你就完成了。@BobVesterman:我没说这不是答案。我只是想检查我对最长递增子序列问题的理解是否正确。谢谢你的解释。我想你一定是误解了“最长增长子序列问题”。该问题允许非连续子序列;因此,对于任何给定的元素,您都无法立即判断它是否表示增加(因为在获得完整的解决方案之前,您不知道前一个元素是什么)。所以没有“着色论证”;没有合理的方法将最长递增子序列问题映射到一个问题,在这个问题中,我们可以通过查看元素来判断是否包含元素。投票赞成暗示Kadane的算法,这是一种规范方法。@N.Wouda谢谢。在再次阅读我的解决方案后,即使我认为它不够清晰,没有任何事先了解Kadane算法的人也无法理解。尽管人们可以/应该尝试查找并找到几个相同的链接,以便更好地理解。Upvote支持暗示Kadane的算法,这是一种规范的方法。@N.Wouda谢谢。在再次阅读我的解决方案后,即使是我也认为它对某些人来说不够清楚