我试图在创建的几个算法上获得最差的运行时复杂度顺序。但是我遇到了一个问题,我一直倾向于为算法选择错误或错误的基本操作量。
对我来说,基本操作的选择似乎更像是一门艺术,而不是一门科学。谷歌搜索和阅读我的文本框后,我仍然没有找到一个很好的定义。到目前为止,我已将其定义为“在算法执行中始终发生的操作”,例如比较或数组操作。
但算法通常会进行许多比较,这些比较总是被执行,所以您选择哪种操作?
答案 0 :(得分:1)
我在某种程度上同意这是一门艺术,所以你应该在编写文档时总是澄清等等。但通常它是对底层数据结构的“访问”。就像你说的那样,对于数组来说,它是比较或交换,对于哈希映射,它可能是对键的手动检查,对于图形来说,它是访问顶点或边缘等。
答案 1 :(得分:1)
即使是练习复杂性理论家也会对这类事情产生分歧,所以接下来可能有点主观:http://blog.computationalcomplexity.org/2009/05/shaving-logs-with-unit-cost.html
big-O表示法的目的是总结算法对读者的效率。在实际环境中,我最关心算法需要多少个时钟周期,假设big-O常量既不是非常小也不是大(并且忽略了内存层次结构的影响);这是链接帖子中提到的“单位成本”模型。
计算排序算法比较的原因是比较的成本取决于输入数据的类型。你可以说排序算法需要O(c n log n)个周期,其中c是比较的费用,但在这种情况下更简单的是计算比较,因为算法执行的其他工作是O(n log n)。有一种排序算法,它按n ^ 2 log n步和n ^ 2比较对n个排序长度为n的数组进行排序;在这里,我希望比较的数量和计算开销分别说明,因为它们不一定支配另一个。
答案 2 :(得分:0)
这仅在您实际实现算法时有效,但您可以使用分析器查看哪个操作是瓶颈。这是一个实际的观点。理论上,有些人认为不是基本操作的所有事情都是零时间运行。
答案 3 :(得分:0)
我听到的一个简单的定义是:
至少执行任何其他操作的操作 算法中的操作。
例如,在排序算法中,这些往往是比较而不是分配,因为您几乎总是必须在重新订购之前访问并“检查”元素,但检查可能不会导致重新排序。因此,总是至少会有与分配一样多的比较。