排序算法对结果的唯一要求就是操作数满足全序关系:
如果 a≤b 并且 b≤c 那么 a≤c(传递性)。
对于 a 或 b,要不 a≤b,要不 b≤a(完全性)。
这个问题可以用信息论来回答。
我从 1 到 5 中挑一个数字出来让你来猜,每回合你都可以问我一个问题,我的回答“是”或“不是”(1 或 0),那么你至少需要几个回合才能保证猜出这个数字?
比较符合这个游戏精神的玩法是从自己的幸运数字(比如我的是7)开始猜起,一个一个地问我“是不是X?”, 可能你的运气足够好,一个回合就能够猜对,但是在最坏的情况下可能就需要5个回合,所以你的答案应该是“至少需要5个回合” (事实上你至少只需要一次就“有可能”猜出来,但为了“保证能”猜出来,你只好委曲求全地说 5), 换句话说这种猜法的最优下界是 5。 (平均性能是 1×1/5+2×1/5+…+5×1/5=(1+…+5)/5 = 3)
但因为你会二分,所以会这样问“是不是比3大?”……而且无论我挑出的数字是几,都只用3个回合。 二分显然是一种更佳的策略,那么它好在什么地方呢? 用信息论理解: 最大的熵。
英文版维基百科词条有个大致的解释:Comparison_sort, 最少次数为 log(5!) = 6.91,取整的话,就是 7。
决策树如下:
如果我们用归并排序的话,比较次数是O(nlogn),因为归并排序是 全局最优解,但是在局部,归并并不都保证是最优的。
附一张快速排序的 gif 图:
地址: http://tieba.baidu.com/f?kw=2dfm&fr=ala0
有时间可以研究下。
刚开始用Xcode是不是发现以前熟悉的开发环境的快捷键都不能用了?怎么快捷运行,停止,编辑等等、都不一样了。快速的掌握这些快捷键,能提供开发的效率。
其实快捷键在Xcode的工具栏里都标注有,只是有的符号和你的键盘上的符号对应不起来罢了。下面截图工具栏里的快捷键总结一下常用快捷键的用法。
一、关于运行调试
1、运行,停止,都在工具栏的Product里。
Command + R 运行。
Command + . 停止
2、F6单步调试、F7跳入,F8继续, 和Eclipse,VS类似
二、导航
这是导航里的快捷键
到这里要解释一下,有的同学可能不知道里面的符号代表什么,那个花键大家都知道,是command键,其他的几个键那,怎么在键盘上找不到呢?不着急,看图:
其实分别是咱们常用的option 、control、shift键。
1、切换头文件和m.文件,很实用
Command + control+ 上下箭头键
2、go back,回退,干嘛用啊,就是回到你上次打开的页面。
control+command+ 左箭头
go forward 回到你前面打开的页面
control+command+ 右箭头
三、文件 File
新建项目 command+shift+n
新建文件 command+n
新建空文件 command+control+n
打开 command+o
关闭窗口 command+w
保存所有文件 command+option+s
还原到保存时状态 command+u
左缩进 command+[
右缩进 command+]
control-B: 向左一个字符(backward)
control-P: 前一行(previous)
control-N: 后一行(next)
control-A: 去行首
control-E: 到行尾(end)
control-T: 调换光标两边的字符(transpose)
control-D: 删除光标右侧字符(delete)
control-K: 删除本行剩余的字符(kill)
Shift + Command + G: 搜索上一处