问题由来是一位非计算机专业的同窗初学算法课,在一些虚拟情景下解题很是地头疼而出现的。
颇有意思的是,从回答他的问题中,我也从新思考了一些问题。算法
Try to create a useful algorithm that takes O(n^2) for the worst case Omega(1) for the best case Theta(log(n)) for the average
当写到这题的时候,我没多想就写了一连串if else,而后往里面填充算法。
可当我试图引导我同窗作这道题时,出现了如下对话segmentfault
”你怎么会用sorting(分类)的算法呢?“
”为何不能用sorting啊?“
”由于sorting最快average也要O(Nlog(N))啊。“
”为何啊?“code
因而我给他看了sorting算法的表格。虽然解决了问题,但仍是不能解决”为何“啊。说实话,一开始,我也只是把这算法当作规律给记下来了。为何sorting就不能更好了呢?是否有更好的方法来证实这个呢?排序
因为数学公式在segmentfault上仍是很难编辑,我这里给一个连接好了。get
可是彷佛仍是太复杂了一点,仍是死记硬背的把O(Nlog(N))记下来了。数学
我在想,是否可以这么思考问题。假设,咱们只须要找到数的相同数在一个排序好的N元素的array中,假设咱们并不知道这个数是否为哪一个特定index上,但必然在array中,那很简单,最快的average是O(log(N))。其次,咱们要找到第二个这样的数,仍然是O(log(N))。不断循环这个问题,那最后就出现了O(Nlog(N))的排列,而后,咱们将这个组合打乱。其实是个依次逐步的反向过程。虽然打乱组合显然没有必要去一个一个找数。但这个反向过程确是正向过程的最佳方式。(我以为这两个过程应该能够用数学证实,惋惜如今尚未这个能力。)it
------------------------------------------------------------分割线-------------------------------------------------------------
另外一个问题,多大的几率状况下,咱们须要开始考虑几率是否会影响算法。
这也是来自同窗对话,但我却很是在乎。为何咱们总没有一个肯定性的定义划分,认为多大的几率可能会影响算法,或者说,直接将几率引进入算法中。例如,在排列好的一组从0到n取出的N个数中,用binary search找到特定数,而后greedy search找重复数。那若是出现n个数都是重复数,这个算法就变成了O(N)。可是出现这个的几率为1/n^N。因此才能够近乎不记。是否应该定义但几率的倒数小于big O的数量级时,认为该算法会受到影响。
------------------------------------------------------------分割线-------------------------------------------------------------
这篇随笔实在是很是粗浅,原本想把最近本身看的AKS算法和一些并行运算算法的知识介绍一下。但仍然没能找到一种很好的方式来叙述。最近有可能要参加ACM,因此暂时就这样吧。pdf