arrays - 排序数组中的时间复杂度
问题描述
给定一个降序排列的数组,从这个数组中删除最小元素的时间复杂度是多少?
=================================================
我的最小元素将在最后一个位置,所以 O(n) 找到它?或者我应该应用二进制搜索,因为数组已排序,或者只是 O(1) 到达最后?
解决方案
这实际上取决于您的意思是“从数组中删除”。您有一个按降序排序的数组,并且您想要删除最小元素。
假设数组是[5, 4, 3, 2, 1]
. 你知道数组有多大,所以找到最小元素是 O(1)。你只需索引a[a.length-1]
.
但是删除最后一个元素是什么意思呢?您可以轻松地将那里的值替换为哨兵值,表示该位置不再使用,但是下次您尝试获取最小元素时,您必须访问a[a.length-1]
,然后进行反向扫描以找到第一次使用的元素。当您删除更多项目时,这接近 O(n)。
或者您是否保留一个计数器来告诉您数组中实际使用了多少个值?因此,您将有一个变量 ,count
来告诉您哪个是最后一个元素。当您想获得最小的元素时:
smallest = a[count];
count = count-1;
这仍然是 O(1),但它会在数组中留下未使用的项目。
但是,如果要确保数组长度始终反映其中的项目数,则必须重新分配数组以使其更小。即 O(n)。
因此,您的问题的答案是“视情况而定”。
推荐阅读
- ruby-on-rails - Rspec,水豚,selenium_chrome_headless。提交远程表单后等待响应
- google-apps-script - 单击单元格时的谷歌应用程序脚本分配功能
- java - 如何在java游戏中分离视图和模型?
- java - 持有视图的适配器中的 NullPointerException
- sql - 如何获得正确的内部联接和子 sql?
- reactjs - 如何在 React Native 中使用背景?
- arrays - 在重复中更改单元格引用
- java - 无论上午/下午如何检查时间段是否与另一个时间段重叠
- javascript - 如何使用下拉菜单中的值计算输入字段中的数字?
- c# - 带有页面对象模型的 Specflow 中的常见步骤定义