time-complexity - 在插入新项目线性时间O(n)时对数组进行排序?
问题描述
如何在插入新元素时对数组进行排序?首先它是空的。当我添加新项目时,它将被排序。我可以在插入 O(n) 时空时这样做吗?
解决方案
遍历数组1,并在现有元素之间插入元素(a[i] < new <= a[i+1]
,这是第一个位置a[i] < new
)。然后将数组中的每个现有元素在插入新元素的位置后移动一个索引 ( a[j+1] = a[j] for j > i
)。当数组被移动时,使用一个临时变量来保持浮点值。这也可以稍微改变以向后迭代,然后不需要显式临时变量,因为移位是在插入之前完成的。
因此,每个单独元素的插入是 O(n),对于 n 个插入,总体而言是 O(n*n) 。1即使需要创建一个新数组,例如在具有固定数组大小的语言中,空间也是 O(2n),与 O(n) 相同。无论移动现有元素或分配新数组并复制所有元素,Big-O 时间复杂度都保持不变。
空间分配成本可以通过在阵列结构中预先分配松弛来“摊销”。这只是实施质量问题。使用二分搜索查找插入点不会改变“最坏情况”的 Big-O 边界:考虑何时插入总是发生在第一个索引处。
推荐阅读
- vuejs2 - Vue onclick 显示特定项目
- database-design - 如何在 DynamoDb 中对手动排序的 ToDo 列表进行建模?
- dynamics-crm - Dynamics CRM 移动活动表单附件
- javascript - 通过节点 js 和 Angular 将文件上传到 multer
- javascript - 如何通过查找文档元素名称来匹配文档元素 ID?
- haskell - 返回整数列表的平均值(作为浮点数) - haskell
- alpine.js - 用于动态选择菜单的 AlpineJS
- laravel - 如何添加旧数据以选择输入通知
- node.js - 使用 firebase 函数解决 CORS
- shopify - Shopify:如何显示每个位置变体的库存数量?