问题由来是一位非计算机专业的同学初学算法课,在一些虚拟情景下解题非常地头疼而出现的。
很有意思的是,从回答他的问题中,我也重新思考了一些问题。
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,然后往里面填充算法。
可当我试图引导我同学做这道题时,出现了以下对话
”你怎么会用sorting(分类)的算法呢?“
”为什么不能用sorting啊?“
”因为sorting最快average也要O(Nlog(N))啊。“
”为什么啊?“
于是我给他看了sorting算法的表格。虽然解决了问题,但还是不能解决”为什么“啊。说实话,一开始,我也只是把这算法当做规律给记下来了。为什么sorting就不能更好了呢?是否有更好的方法来证明这个呢?
由于数学公式在segmentfault上还是很难编辑,我这里给一个链接好了。
但是似乎还是太复杂了一点,还是死记硬背的把O(Nlog(N))记下来了。
我在想,是否能够这么思考问题。假设,我们只需要找到数的相同数在一个排序好的N元素的array中,假设我们并不知道这个数是否为哪个特定index上,但必然在array中,那很简单,最快的average是O(log(N))。其次,我们要找到第二个这样的数,仍然是O(log(N))。不断循环这个问题,那最后就出现了O(Nlog(N))的排列,然后,我们将这个组合打乱。实际上是个依次逐步的反向过程。虽然打乱组合显然没有必要去一个一个找数。但这个反向过程确是正向过程的最佳方式。(我觉得这两个过程应该可以用数学证明,可惜现在还没有这个能力。)
------------------------------------------------------------分割线-------------------------------------------------------------
另一个问题,多大的概率情况下,我们需要开始考虑概率是否会影响算法。
这也是来自同学对话,但我却非常在意。为什么我们总没有一个确定性的定义划分,认为多大的概率可能会影响算法,或者说,直接将概率引进入算法中。例如,在排列好的一组从0到n取出的N个数中,用binary search找到特定数,然后greedy search找重复数。那如果出现n个数都是重复数,这个算法就变成了O(N)。但是出现这个的概率为1/n^N。所以才可以近乎不记。是否应该定义但概率的倒数小于big O的数量级时,认为该算法会受到影响。
------------------------------------------------------------分割线-------------------------------------------------------------
这篇随笔实在是非常粗浅,本来想把最近自己看的AKS算法和一些并行运算算法的知识介绍一下。但仍然没能找到一种很好的方式来叙述。最近有可能要参加ACM,所以暂时就这样吧。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。