【发布时间】:2020-07-06 22:00:26
【问题描述】:
我想证明为什么要在 O(n) 中找到大小为 n 的数组的最长非连续非递减子序列。
“查找”是指知道它的长度,以及相关索引的列表。
Here is a solution 在NlogN。
Here is the Wikipedia article.
我想说服自己,不能再快了。
这里是部分证明:
假设这可能比O(nlogn) 更快,为简单起见,O(n) 但这适用于比O(nlogn) 更好的任何东西
我们可以将两个排序数组合并成一个排序数组,由O(n1 + n2)中的所有元素组成。
给定一个数组A,然后我们可以在O(n) 中找到其最长的非连续非递减子序列。
如果这个序列小于n/2,那么对于reversed(A),它大于或等于n/2 [我需要证明]
这样,我们可以将数组拆分为已排序的块,每次都在O(n)中,并留下大小为k的余数,也可以在O(k) + O(remainer)中拆分和排序,直到剩下一个元素是O(1)。
因此,对数组进行排序需要O(n)
【问题讨论】:
标签: python arrays algorithm sorting