Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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
Python 3.x 荷兰国旗问题运行在O(n)_Python 3.x_Sorting_Dutch National Flag Problem - Fatal编程技术网

Python 3.x 荷兰国旗问题运行在O(n)

Python 3.x 荷兰国旗问题运行在O(n),python-3.x,sorting,dutch-national-flag-problem,Python 3.x,Sorting,Dutch National Flag Problem,我是CompSci 1的10年级学生。在我们的教科书中,它提到了荷兰国旗问题。以下是该练习的逐字说明: Edsgar Dijkstra以其在编程语言方面的工作而闻名。他提出了一个巧妙的问题,他称之为荷兰国旗问题:给定一个字符串列表,每个字符串都是红色、绿色或蓝色的,每个字符串在列表中代表多次,重新排列列表,使字符串按照荷兰国旗的顺序排列,首先是所有红色字符串,然后是所有绿色字符串,然后是所有的蓝线 以下是我为本练习编写的python代码: def dutch_flag(colors: list)

我是CompSci 1的10年级学生。在我们的教科书中,它提到了荷兰国旗问题。以下是该练习的逐字说明:

Edsgar Dijkstra以其在编程语言方面的工作而闻名。他提出了一个巧妙的问题,他称之为荷兰国旗问题:给定一个字符串列表,每个字符串都是红色、绿色或蓝色的,每个字符串在列表中代表多次,重新排列列表,使字符串按照荷兰国旗的顺序排列,首先是所有红色字符串,然后是所有绿色字符串,然后是所有的蓝线

以下是我为本练习编写的python代码:

def dutch_flag(colors: list)-> list:
  """
  This function takes a list of strings of colors (red, green, 
  or blue),and returns a list containing them with the reds first, 
  the greens second, and the blues last.
  """
  reds = 0
  greens = 0
  blues = 0
  for color in colors:
    color = color.lower().strip()
    if color == "red":
      reds += 1
    elif color == "green":
      greens += 1
    elif color == "blue":
      blues += 1

  flag = []
  for i in range(0, reds):
    flag.append("red")
  for i in range(0, greens):
    flag.append("green")
  for i in range(0, blues):
    flag.append("blue")

  return flag  

我的代码按时运行。然而,我的老师告诉我们,这个程序需要一个排序算法,充其量是在*logn上。为什么我的代码更快?

您显示的是计数排序。其他非比较选项是桶排序或基数排序,它们也具有时间复杂性

也可以使用基于比较的3路划分函数来解决这个问题,该函数使用时间复杂度较高的比较和交换

通常,基于比较的排序需要logn时间,但荷兰国旗问题不需要这样做


3路分区函数可以扩展以处理更多的颜色。第一步将阵列分为3个子阵列,小、中、大,然后在每个子阵列上重复该过程,将其分为3个子阵列,依此类推。9种颜色可以在2次过程中完成,第一次过程分为小、中、大,然后第二次过程将每个子阵列分为3部分,这也是时间复杂度方面的问题。对于n个元素和k个颜色,时间复杂度为On⌈log3k⌉, 但是因为k是一个常数,所以时间复杂度是开的。

您的代码是正确的,并且运行时间为O2n,因为它不会对任何内容进行排序。如果你能诚实地看到你老师对这一点的看法,那将是很有趣的。我认为他们的版本会起作用,并通过更复杂的列表保持秩序,比如[红色法拉利、绿色苹果、红色樱桃、蓝色浆果]。因为你欺骗并使用了关于问题的先验知识。这通常是完全有效的选择。这取决于重新排列给定数组/列表的要求,或者您是否可以返回不同的数组/列表。顺便说一下,如果您要删除该范围并附加,您可以直接执行flag=[red]*reds+[green]*grees+[blue]*blue。