悲观算法与简单性分析

2013年10月25日

我一直在读书悲观算法与简单性分析 安德烈·布罗德和豪尔赫·斯托尔菲。这很有趣。他们编写了三个程序:搜索排序数组中的项,枚举连接图中的所有项,并将数组按升序排序;我们将查看排序算法,但您可能需要自己查看其他算法。下面是他们的排序算法:

这个慢速排序算法是对乘法投降范式,这可能是不情愿算法开发中最重要的一个范式。基本的乘法和放弃策略是将手头的问题替换为两个或多个子问题,每个子问题都比原始问题略简单,并尽可能长时间地以这种方式递归地乘法子问题和子问题。在某个时候,子问题都会变得如此简单,以至于它们的解决方案不能再被推迟,我们将不得不放弃。经验表明,在大多数情况下,当达到这一点时,总工作量将大大高于采用更直接的方法所浪费的工作量。

为了更好地掌握乘法和投降法,让我们循序渐进地学习慢速排序算法。我们可以分解排序问题n个数字A,A2,…,An个按升序排列为:(1)找出这些数字中的最大值,(2)对其余的数字进行排序。子问题(1)可以进一步分解为(1.1)f和第一个问题的最大值[n个/2] 元素,(1.2)f和其余元素的最大值[n个/2] 元素,以及(1.3)f这两个最大值中的最大值。最后,子问题(1.1)和(1.2)可以通过对指定元素进行排序并获取结果中的最后一个元素来解决。因此,我们将原来的问题乘以三个稍微简单的问题(对前半部分进行排序,对后半部分进行分类,对除一个以外的所有元素进行排序),再加上一些开销处理。我们继续递归地这样做,直到列表中每个元素最多只有一个元素,此时我们不得不放弃。

我没有抄袭文章中的代码;如果你去看它,小心虫子!算法的时间复杂度为O(n个日志2(n个)/2).

您的任务是编写慢速排序程序;您可能还想编写研究bwfs(磅/英尺)文章中提到的程序。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布解决方案或讨论练习。

页:1 2

6对“悲观算法和简单性分析”的回应

  1. 保罗

    Python中的Slowsort。

    定义慢排序(L):n=长度(L)如果n==1:返回L中间=n//2mx=最大值(慢排序(L[:mid])[-1],慢排序(L[mid:])[-1-)L.移除(mx)返回慢速排序(L)+[mx]
  2. 在Racket中实现较慢。

    #朗球拍(define(慢速排序!v[i 0][j(向量长度v)])(条件[(<=(-j i)1)v][其他(定义k(商(+j i)2))(慢排序!v i k)(慢排序!v k j)(定义max-a(矢量参考v(-k 1)))(定义max-b(矢量参考v(-j 1)))(向量集!v(-k 1)(最小-最大-a最大-b))(向量集!v(-j 1)(最大值-a最大值-b))(慢排序!vi(-j 1))])
  3. 朱西·皮图莱宁

    非局部,提取最小值而不是最大值。咖啡脚本。(显然,这种语言中没有整数除法,无论是地板还是其他类型的除法,但有许多“技巧”,如x|0可以截断x。)

    排序=(arr)->
    [arr,res]=[arr[0…arr.length],[]]
    当arr.length>0时
    i=最小值(arr)
    响应脉冲(i)
    k=arr.indexOf(i)
    arr[k..k]=[]
    资源

    最小值=(arr)->
    如果arr.length为1,则arr[0]
    其他
    a=排序(arr[0…arr.length/2|0])[0]
    b=排序(arr[arr.length/2|0…arr.lendth])[0]
    如果a<b,则a其他b

    控制台.log(排序([3,1,4,1,5,9,2,6])

  4. […]在已排序的数组中查找目标x的索引。我们研究了上一个练习中提到的不同算法。我让你去取报纸,享受作者的真诚[…]

  5. 迈克

    在研究慢排序算法时,我意识到,通过将A[m]与A[j]交换,完全是为了将A[m移动到位。一个更好(即更差)的算法将A[m]与A[m+1]交换,并重复直到A[m]位于列表的末尾(就像气泡排序一样)。显然,我称之为“slowersort”的改进算法更为悲观。

    def slowersort(awry,i=无,j=无):如果i为“无”:i=0如果j为无:j=长度(倾斜)-1如果i<j:m=(i+j)//2慢速运动(歪斜,i,m)慢速排序(awry,m+1,j)如果awry[m]>awry[j]:对于范围(m,j)中的k:awry[k],awry[k+1]=awry[k+1],awry[k]慢速排序(awry,i,j-1)awry=列表('hgfedcba')打印(歪斜)慢速(歪斜)打印(歪斜)
  6. 丹尼尔·福格斯

    一般来说,对于任何给定的问题,是否存在一种悲观算法(无论是在时间上还是在空间上),而在这种情况下,可证明没有任何算法更不情愿(无论是时间上还是空间上)?当然,不会有任何浪费资源的欺骗行为(无论是在时间上还是空间上)。例如,递归计算斐波那契数(无需记忆):这是斐波那奇数最慢的算法吗?

留下评论