家人们,一道求极限有对数差和根号得体,帮我检查一下看过程标不标准?

    我们之前所有的排序算法都是给定了数据再进行排序,排序的效率很大程度上取决于数据的好坏。我们今天所介绍的是一个完全不同的排序方法,它可以在“暗箱”里对数据进行排序(即你不必知道实际数据是什么),换句话说这种排序方法不依赖于数据(Data-Independent),所有比较操作都与数据无关。你甚至可以立即忘掉前面的比较结果,因为对于所有可能的数据这类排序算法都能得到正确答案并且排序步骤完全相同。本文结束后再回过头来看这段话你将有更深的认识。
    我们设置一个暗箱,暗箱左边有n个输入口,暗箱右边有n个输出口。我们需要设计一个暗箱使得,任意n个数从左边输进去,右边出来的都是有序的。图1显示了有4个输入的暗箱。
    暗箱里唯一允许的元件叫做“比较器”(Comparator),每个比较器连接两个元素,当上面那个比下面那个大时它将交换两个元素的位置。也就是说,每经过一个比较器后,它的两端中较小的一个总是从上面出来,较大的总是到了下面。图2显示了一种包含4个比较器的暗箱系统。当输入数据3,1,4,2通过这个系统时,输出为1,3,2,4,如图3所示。这种暗箱结构叫做比较网络(Comparator Network)。如果对于任意一个输入数据,比较网络的输出都是有序的,那么这个比较网络就叫做排序网络(Sorting Network)。显然,我们例子中的比较网络不是一个排序网络,因为它不能通过3,1,4,2的检验。

    现在,我们的第一个问题是,是否存在比较网络。就是说,有没有可能使得任意数据通过同一组比较器都能输出有序的结果。我们最初的想法当然是,把我们已知的什么排序算法改成这种形式。把原来那十种排序又翻出来看一遍,找一找哪些排序的比较操作是无条件的。运气不错,我们所学的第一个算法——冒泡排序,它的比较就是无条件的,不管数据怎样冒泡排序都是不断比较相邻元素并把较小的放到前面。冒泡排序是一个彻头彻尾的排序网络模型,我们可以立即画出冒泡排序所对应的排序网络(图4)。这是我们得到的第一个排序网络。我们通常不认为插入排序是排序网络,因为插入排序的比较次数取决于数据的有序程度。
    传统的计算机一次只能处理一个比较。排序网络真正的研究价值在于,假如有机器可以同时处理多个比较器,排序的速度将大幅度提高。我们把比较器的位置稍微移动一下,把那些互不冲突(处理的元素不同)的比较器压缩到一层(Stage)(图5),这样整个排序过程压缩为了2n-3层。实现排序网络的机器可以在单位时间里并行处理同一层中所有的比较。此时,比较次数的多少对排序效率不起决定作用了,即使比较次数多一些但是排序网络的层次更少,效率也会更高一些。我们自然又想,排序网络需要的层数能否少于2n-3。我们想到,图5的左下角和右下角似乎有些空,我们期望能在这些位置加一些比较从而减少层数。图6给出了一个只有n层的排序网络,这叫做奇偶移项排序(Odd-even Transposition Sort)。我们下文将证明它确实是一个排序网络。这次的图很多,排版也很困难,累死我了。我把下面的图7也放到这里来了,不然到处都是图很难看。

    给出一个比较网络,怎样判断它是不是一个排序网络?很遗憾,现在还没有找到一种好的算法。事实上,这个问题是一个NPC问题。注:这种说法是不准确的,因为目前还没有迹象表明这个问题是NP问题。准确的说法应该是,“判断某比较网络为排序网络”是Co-NP Complete,而“判断某比较网络不是排序网络”(即找到一个反例)才是NP Complete。
    传统的做法是枚举所有n的排列来验证,一共要考虑n!种情况。下面我们介绍排序网络理论里最重要的结论:0-1原理(0-1 Principle)。使用这个原理来验证排序网络只需要考虑2^n种情况。0-1原理告诉我们,如果所有的01序列能够通过比较网络排出顺序,那么这足以说明该网络为排序网络。证明过程很简单。为了证明这个结论,我们证明它的逆否命题(逆否命题与原命题同真假):如果一个比较网络不是排序网络,那么至少存在一个01序列不能被排序。我们给出一种算法,这个算法可以把任何一个不能被排序的输入数据转化为一个不能被排序的01序列。
    在最初的例子(图3)中,输入数据3,1,4,2的输出为1,3,2,4,没有成功地排出顺序,从而判断出该网络不是排序网络。这说明,输出结果中存在逆序对(左边某个数大于右边的某个数)。我们从输出结果中找出一个逆序对来。例子中,(3,2)就是我们要找的数。现在,我们把输入中所有小于数字3(左边那个数)的数都变成0,把所有大于等于3的数都变成1。这样,3,1,4,2就变成了1,0,1,0。显然,把得到的这个01序列输入进去,原来曾经发生过交换的地方现在仍然会交换,原来不曾交换的地方现在也同样不会发生交换(当两个0或两个1进行比较时,我们既可以认为它们不交换,也可以看成它们要互相交换,反正都一样)。最后,该01序列输出的结果中,本来3的位置现在还是1,原来2的位置现在仍然是0,逆序对仍然存在。因此,只要一个比较网络不是排序网络,那么总可以找到一个01序列不能被排序。等价地,如果所有的01序列都能被排序了,这个比较网络也就是排序网络了。

    我们用0-1原理来证明奇偶移项排序的正确性。我们对n进行数学归纳证明。n=2时(一个“工”字)显然是排序网络。
    图中是n=8的情况。我们假设对于所有n<=7,奇偶移项排序网络都是正确的。我们同时假定所有输入数字非0即1,下面我们说明n=8时所有的01序列都能被正确排序。
    假设最后一个数是1(图7,在前面的),那么这个1将始终排在最后不参与任何交换操作,对前面7个数没有任何影响。除去无用的灰色部分,剩下的就是n=7这一规模较小的子排序网络,由归纳假设则n=8也是排序网络;
    假设最后一个数是0(图8),那么在每一次比较中这个0都会被提到前面去(前面说过,两个0之间交不交换是一回事)。蓝色的箭头表示每个数跑到了什么位置。你会发现除最后一个数以外前7个数之间的比较器又构成了n=7的情况。

    接下来,我们提出一些比较器个数为O(n*logn*logn)的排序网络。其中一种就是之前提到过的。这种增量排序的特点是每一趟排序中的每个数只与前面的数比较一次,因此它可以非常方便地转化为排序网络。图9就是一个n=8的Shell排序网络。Bitonic排序也可以做到
O(n*logn*logn)的比较器个数,今天不介绍它。下面详细介绍奇偶归并排序网络。
    奇偶归并排序网络也是一种比较器个数为O(n*logn*logn)的排序网络。它和几乎相同,不同的只是合并的过程。普通归并排序的O(n)合并过程显然是依赖于数据的,奇偶归并排序可以把这个合并过程改成非数据依赖型,但复杂度将变高。这个合并过程本身也是递归的。我们假设n是2的幂(不是的话可以在前面添0补足,这对复杂度的计算没有影响),算法首先把n个数中所有的奇数项和偶数项分别递归地合并,然后在排序后的第i个偶数项和第i+1个奇数项之间设立比较器。
    假如1,4,6,8和2,3,7,9是两段已经有序的子序列,合并过程首先递归地合并1,6,2,7和4,8,3,9,这样原数列就变成了1,3,2,4,6,8,7,9。然后分别把(3,2),(4,6),(8,7)三对相邻元素中各自较小的那个交换到前面,完成合并操作。使用0-1原理证明这个结论出乎意料的简单:图10显示了n=16的情况,白色的方格代表一个0,灰色方格代表1。奇偶项分别排序后,偶数项1的个数最多比奇数项多出2个,我们设立的比较器可以考虑到所有的情况,不管什么情况都能让它最终变得有序。
    由前面说过的结论,合并过程总共需要比较O(nlogn)次。归并排序递归一共有O(logn)层,每一层总的比较器个数不超过O(nlogn),因此总共O(n*logn*logn)。一个n=8的完整的奇偶归并排序网络如图11所示。

  所有排序的知识到这里说完了,下次再发布的就是数论相关内容了。数论部分将从进位制开始谈起。
  我会一直写下去,本人活到什么时候写到什么时候写完为止。不过,这几天缓一下,我计划做一个PJBlog的单版面论坛模块。

    那么,有什么方法可以不用比较就能排出顺序呢?借助Hash表的思想,多数人都能想出这样一种排序算法来。
    我们假设给出的数字都在一定范围中,那么我们就可以开一个范围相同的数组,记录这个数字是否出现过。由于数字有可能有重复,因此Hash表的概念需要扩展,我们需要把数组类型改成整型,用来表示每个数出现的次数。
    看这样一个例子,假如我们要对数列3 1 4 1 5 9 2 6 5 3 5 9进行排序。由于给定数字每一个都小于10,因此我们开一个0到9的整型数组T[i],记录每一个数出现了几次。读到一个数字x,就把对应的T[x]加一。

    最后,我们用一个指针从前往后扫描一遍,按照次序输出0到9,每个数出现了几次就输出几个。假如给定的数是n个大小不超过m的自然数,显然这个算法的复杂度是O(m+n)的。

    我曾经以为,这就是线性时间排序了。后来我发现我错了。再后来,我发现我曾犯的错误是一个普遍的错误。很多人都以为上面的这个算法就是传说中的计数排序。问题出在哪里了?为什么它不是线性时间的排序算法?原因是,这个算法根本不是排序算法,它根本没有对原数据进行排序。

问题一:为什么说上述算法没有对数据进行排序?
/blog/article.asp?id=34。人们很难想到这样一些完全找不到突破口的东西竟然能够证明得到。说“没有突破口”还不够确切。准确地说,有些命题多数人认为“怎么可能能够证明”却用了一些技巧使得证明变得非常简单。我看了五色定理的证明,定理宣称若要对地图进行染色使得相邻区域不同色,五种颜色就够了。没看证明之前,我一直在想这个玩意儿可以怎么来证明。直到看了证明过程后才感叹居然如此简单,并且立即意识到四色定理基本上也是这种证明方法。还有,像“一个单位正方形里不可能包含两个互不重叠且边长和超过1的小正方形”这样的命题竟然完全用初中学的那些平面几何知识证明到了,简单得不可思议。关键是,我们能够读懂证明过程,但只有牛人才能想到这个证明过程。
    今天在OIBH上看到了,帖子中分享的一篇文章恰好说明了这一点。文章中包含有一个推翻“万物皆数”的新思路,相当有启发性。今天我想把我已经知道的四种证明连同新学到的这一个一起写下来。

    古希腊曾有“万物皆数”的思想,这种认为“大自然的一切皆为整数之比”的思想统治了古希腊数学相当长的一段时间,许多几何命题都是根据这一点来证明的。当时的很多数学证明都隐性地承认了“所有数都可以表示为整数之比”,“万物皆数”的思想是古希腊数学发展的奠基。直到有一天,毕达哥拉斯的学生Hippasus告诉他,单位正方形的对角线长度不能表示为两个整数之比。被人们公认的假设被推翻了,大半命题得证的前提被认定是错的,古希腊时代的数学大厦轰然倒塌,数学陷入了历史上的第一次危机。最后,Eudoxus的出现奇迹般地解决了这次危机。今天我们要看的是,为什么单位正方形的对角线长度不能表示为两个整数之比。
    单位正方形的对角线长度怎么算呢?从上面的这个图中我们可以看到,如果小正方形的面积是1的话,大正方形的面积就是2。于是单位正方形的对角线是面积为2的正方形的边长。换句话说,Hippasus认为不可能存在某个整数与整数之比,它的平方等于2。
    中学课程中安排了一段反证法。当时有个题目叫我们证根号2是无理数,当时很多人打死了也想不明白这个怎么可能证得到,这种感觉正如前文所说。直到看了答案后才恍然大悟,数学上竟然有这等诡异的证明。
    当然,我们要证明的不是“根号2是无理数”。那个时候还没有根号、无理数之类的说法。我们只能说,我们要证明不存在一个数p/q使得它的平方等于2。证明过程地球人都知道:假设p/q已经不能再约分了,那么p^2=2*q^2,等式右边是偶数,于是p必须是偶数。p是偶数的话,p^2就可以被4整除,约掉等式右边的一个2,可以看出q^2也是偶数,即q是偶数。这样,p也是偶数,q也是偶数,那么p和q就还可以继续约分,与我们的假设矛盾。

    根号2是无理数,我们证明到了。根号3呢?根号5呢?你可能偶尔看到过,Theodorus曾证明它们也是无理数。但Theodorus企图证明17的平方根是无理数时却没有继续证下去了。你可以在网上看到,Theodorus对数学的贡献之一就是“证明了3到17的非平方数的根是无理数”。这给后人留下了一个疑问:怪了,为什么证到17就不证了呢?一个俄国的数学历史家“猜”到了原因。
    他猜测,当时Theodorus就是用类似上面的方法证明的。比如,要证明根号x不是有理数,于是p^2=x*q^2。我们已经证过x=2的情况了,剩下来的质数都是奇数。如果x是奇数且p/q已经不能再约分,那么显然p和q都是奇数。一个奇数2n+1的平方应该等于4(n^2+n)+1,也即8 * n(n+1)/2 + x-1。于是x-1必须是8的倍数。如果当时Theodorus是这么证明的,那么他可以得到这样一个结论,如果x-1不能被8整除,那么它不可能被表示成(p/q)^2。好了,现在3、5、7、11、13减去1后都不是8的倍数,它们的平方根一定不是有理数。在x=9时发生了一次例外,但9是一个平方数。而当x=17时这种证明方法没办法解释了,于是Theodorus就此打住。

    实际上,我们上面说的这么多,在古希腊当时的数学体系中是根本不可能出现的。毕达哥拉斯时代根本没有发展出代数这门学科来,它们掌握的只是纯粹的几何。因此,Hippasus当时的证明不可能像我们现在这样搞点什么奇数x偶数y之类的高科技东西。事实上,Hippasus当时完全运用的平面几何知识来证明他的结论。有人觉得奇怪了,既然当时没有代数,古希腊人是怎么提出“所有数都可以表示为整数之比”的呢?其实古希腊人根本没有提出什么整数之比,这是后人的一个误解。当时毕达哥拉斯学派提出的,叫做“公度单位”。
    两条线段的公度单位,简单的说就是找一个公度量,使得两条线段的长度都是这个公度量的整倍数(于是这个公度量就可以同时作为两条线段的单位长度并用于测量)。寻找公度量的方法相当直观,就是不断把较长的那个线段减去短的那个线段,直到两个线段一样长。熟悉数论的同学一下就明白了这就是欧几里德的辗转相除算法求最大公约数。第一次数学危机的根结就在于,古希腊人理所当然地相信不断地截取线段,总有一个时候会截到两个线段一样长。后来,Hippasus画了这么一张图,告诉大家了一个反例:有可能这个操作会无穷尽地进行下去。
    现在看他怎么解释,在图中的BC和BD之间进行辗转相除为什么永远不能停止。把BD减去BC,剩下一段DE。以DE为边做一个新的小正方形DEFG,那么显然DE=EF=FC(∵△EDF为等腰直角且△BEF≌△BCF)。接下来我们应该在BC和DE间辗转相除。BC就等于CD,CD减去一个DE相当于减去一个FC,就只剩下一段DF了。现在轮到DE和DF之间辗转相除,而它们是一个新的正方形的边和对角线,其比例正好与最初的BC和BD相当。于是,这个操作再次回到原问题,并且无限递归下去。最后的结论用我们的话说就是,不存在一个数x使得BC和BD的长度都是x的整倍数。于是,BD/BC不能表示为两个整数之比p/q(否则BD/p=BC/q,这就成为了那个x)。

    有发现上面的代数证明和几何证明之间的共同点吗?它们都是这样的一个思路:假设我已经是满足这个性质的最小的那个了,那么我就可以用一种方法找出更小的一个来,让你无限循环下去,数目越来越小,永

x趋近于0,根号x分之一的tanx次方求极限,用最详细的方法解下看过程,

洛必达法则是在一定条件下通过分子分母分别求导再求极限来确定未定式值的方法[1]。众所周知,两个无穷小之比或两个无穷大之比的极限可能存在,也可能不存在。因此,求这类极限时往往需要适当的变形,转化成可利用极限运算法则或重要极限的形式进行计算。洛必达法则便是应用于这类极限计算的通用方法

我要回帖

更多关于 对数和差公式的推导 的文章

 

随机推荐