陈述式思维

你好流浪者。 我们作为思想中的旅行者和状况的分析者,应该了解它的优点,以及在其他方面的优点,确切的位置,我想提请读者注意这一点。


假设每个步骤都完成了,我们如何将思想链顺序地组合在一起,控制控制流和内存中单元的状态? 或者简单地通过描述问题陈述,告诉程序您要解决的特定任务,这足以编译所有程序。 并不是将编码转换为会改变系统内部状态的命令流,而是将原理表达为排序的概念,因为不必想象在那里隐藏了哪种算法,您只需要获取排序的数据即可。 美国总统可以无休止地提及泡泡,他表达了自己理解编程的思想。 他只是发现有一个排序算法,并且他自己桌面上表中的数据本身无法以某种神奇的方式按字母顺序排列。


我对声明式的表达方式感到满意,并通过一系列命令和过渡来表达一切的想法似乎过时且过时,因为我们的祖父这样做,祖父为配线架上的触点接线并使指示灯闪烁,而且我们有一个监视器和语音识别功能,在这种发展水平上,您仍然可以考虑遵循以下命令...在我看来,如果您以逻辑语言表示该程序,它将看起来更易于理解,并且可以做到这一点。 在技​​术上,早在80年代就下了赌注。


好吧,介绍拖了....


首先,我将尝试重述快速排序机制。 要对列表进行排序,您需要将其分为两个子列表,然后将排序后的一个子列表与另一个排序后的子列表组合在一起


拆分操作必须能够将列表转换为两个子列表,其中一个包含所有基本性较低的元素,第二个列表仅包含较大的元素。 表达这一点,在Erlang上只写了两行:


qsort([])->[]; qsort([H|T])->qsort([X||X<-T,X<H])++[H|qsort([X||X<-T,X>=H])]. 

思考过程结果的这些表达令我感兴趣。


以命令形式提供对排序原理的描述更加困难。 这种编程方法怎么会有优势,然后即使存在s-place-place,至少是fortran,也不会调用它。 是因为javascript以及所有语言的新标准中的lambda函数的所有趋势,都证实了算法上的不便。


我将尝试进行实验,以验证一种方法和另一种方法的优势,然后对其进行测试。 我将尝试证明可以对分类定义的声明式记录及其算法记录进行性能比较,并得出如何更正确地制定程序的结论。 也许这将通过简单的过时的方法通过算法和命令流将编程推向货架,而这些方法根本不适合使用,因为在Haskell或横截面中表达自己同样时尚。 也许不仅神仙的精灵可以使程序看起来清晰紧凑?


我将使用Python进行演示,因为它有多个范例,而且它根本不是C ++,也不再是Lisp。 您可以使用其他范例编写清晰的程序:


排序1


 def qsort(S): if S==[]:return [] H,T=S[0],S[1:] return qsort([X for X in T if X<T])+[H]+qsort([X for X in T if X>=T]) 

可以这样说单词: 排序以第一个元素为基础,然后对所有较小的元素进行排序并将其连接到所有较大的元素,然后再进行排序
也许这样的表达式比以附近某些元素的排列的笨拙形式编写的排序更快地工作。 是否可以更简洁地表达这一点,并且为此不需要太多的文字。 尝试大声提出按气泡排序的原则,并告诉美国总统 ,因为他得到了这些神圣的数据,因此他了解了算法并进行了如下处理:例如, 要对列表进行排序,您需要采用几个元素,将它们相互比较,然后如果第一个大于第二个,则必须进行交换,重新排列,然后您需要从列表的最开始重复搜索成对的此类元素,直到排列结束


是的,排序气泡的原理听起来比快速排序版本更长,但是第二个优点不仅在于记录的简洁性,还在于它的速度,算法所表示的相同快速排序的表达是否会比声明性表达的版本更快? 也许我们需要改变对教学程序设计的看法,这是日本人如何尝试在学校中介绍序言和相关思想教学的必要条件。 您可以系统地远离思想表达的算法语言。


排序2


为了重现这一点,我不得不转向文献 ,这是Hoar的声明,我尝试将其转换为Python:


 def quicksort(A, lo, hi): if lo < hi: p = partition(A, lo, hi) quicksort(A, lo, p - 1) quicksort(A, p + 1, hi) return A def partition(A, lo, hi): pivot = A[lo] i = lo - 1 j = hi + 1 while True do: i= i + 1 while A[i] < pivot do : j= j - 1 while A[j] > pivot if i >= j: return j A[i],A[j]=A[j],A[i] 

我很佩服这个想法,这里需要一个无休止的循环,他会在那插入一个go-that)),那里有一些笑话。


分析方法


现在,让我们列出一长串并按两种方法对其进行排序,并了解如何更快,更高效地表达我们的想法。 哪种方法更容易采用?
创建一个随机数列表作为一个单独的问题 ,这是如何表示的:


 def qsort(S): if S==[]:return [] H,T=S[0],S[1:] return qsort([X for X in T if X<H])+[H]+qsort([X for X in T if X>=H]) import random def test(len): list=[random.randint(-100, 100) for r in range(0,len)] from time import monotonic start = monotonic() slist=qsort(list) print('qsort='+str(monotonic() - start)) ##print(slist) 

这是获得的测量值:


 >>> test(10000) qsort=0.046999999998661224 >>> test(10000) qsort=0.0629999999946449 >>> test(10000) qsort=0.046999999998661224 >>> test(100000) qsort=4.0789999999979045 >>> test(100000) qsort=3.6560000000026776 >>> test(100000) qsort=3.7340000000040163 >>> 

现在,我在算法公式中重复此步骤:


 def quicksort(A, lo, hi): if lo < hi: p = partition(A, lo, hi) quicksort(A, lo, p ) quicksort(A, p + 1, hi) return A def partition(A, lo, hi): pivot = A[lo] i = lo-1 j = hi+1 while True: while True: i=i+1 if(A[i]>=pivot) or (i>=hi): break while True: j=j-1 if(A[j]<=pivot) or (j<=lo): break if i >= j: return max(j,lo) A[i],A[j]=A[j],A[i] import random def test(len): list=[random.randint(-100, 100) for r in range(0,len)] from time import monotonic start = monotonic() slist=quicksort(list,0,len-1) print('quicksort='+str(monotonic() - start)) 

我必须致力于将算法的原始示例从古代资源转换为维基百科。 因此: 您需要获取支持元素并在子数组中排列元素,以便所有内容在左侧越来越少,在右侧越来越多。 为此,将左侧与右侧元素交换。 我们对引用元素除以索引的每个子列表重复此操作,如果没有更改,请完成


合计


让我们看看同一列表的时差是多少,该列表又通过两种方法进行排序。 我们将进行100个实验,并绘制一个图表:


 import random def test(len): t1,t2=[],[] for n in range(1,100): list=[random.randint(-100, 100) for r in range(0,len)] list2=list[:] from time import monotonic start = monotonic() slist=qsort(list) t1+=[monotonic() - start] #print('qsort='+str(monotonic() - start)) start = monotonic() slist=quicksort(list2,0,len-1) t2+=[monotonic() - start] #print('quicksort='+str(monotonic() - start)) import matplotlib.pyplot as plt fig = plt.figure() ax = fig.add_subplot(111) ax.plot(range(1,100),t1,label='qsort') ax.plot(range(1,100),t2,label='quicksort') ax.legend() ax.grid(True) plt.show() test(10000) 

运行时间秒


在这里可以看到-quicksort()函数的运行速度更快 ,但是它的记录不是很明显,尽管该函数是递归的,但要理解其中执行的排列的工作并不容易。


那么,整理思想的哪种表达更自觉?


在性能上的细微差别下,我们在代码的数量和复杂性上得到了这样的差别。


也许真理足以学习命令式语言,但是什么对您更有吸引力?


PS。 这是序言:


 qsort([],[]). qsort([H|T],Res):- findall(X,(member(X,T),X<H),L1), findall(X,(member(X,T),X>=H),L2), qsort(L1,S1), qsort(L2,S2), append(S1,[H|S2],Res). 

Source: https://habr.com/ru/post/zh-CN430964/


All Articles