Algorithm 排序列表所需的最小提取+插入数 上下文
这个问题源于尽量减少昂贵函数调用的数量 问题定义 请注意,摘录和插入!=交换特别是,我们从位置from获取元素,将其插入位置to,并移动所有中间元素Algorithm 排序列表所需的最小提取+插入数 上下文,algorithm,sorting,Algorithm,Sorting,这个问题源于尽量减少昂贵函数调用的数量 问题定义 请注意,摘录和插入!=交换特别是,我们从位置from获取元素,将其插入位置to,并移动所有中间元素 int n; int A[n]; // all elements are integer and distinct function extract_and_insert(from, to) { int old_value = A[from] if (from < to) { for(int i = from; i
int n;
int A[n]; // all elements are integer and distinct
function extract_and_insert(from, to) {
int old_value = A[from]
if (from < to) {
for(int i = from; i < to; ++i)
A[i] = A[i+1];
A[to] = old_value;
} else {
for(int i = from; i > to; --i)
A[i] = A[i-1];
A[to] = old_value;
}
}
问题
我们知道有对数n算法用于对数字列表进行排序
现在:是否有一个On log n函数,它返回对列表进行排序所需的提取和插入的最小调用数?答案是肯定的
这个问题本质上相当于在数组中查找LIS,您可以使用算法来解决这个问题
为什么这个问题相当于最长的递增子序列?
因为每个提取和插入操作都将在最有效的情况下更正数组中恰好一个元素的相对位置。换句话说,当我们考虑数组的最长递增子序列的长度时,每个操作将增加该长度1。因此,所需的最小呼叫数为:
length_of_array - length_of_LIS
因此,通过查找LIS的长度,我们将能够找到所需的最小操作数
一定要阅读链接的维基百科页面,看看如何实现该算法。@AlmaDo:这不是问题所在。问题是:是否有一个On log n算法可以返回对列表排序所需的提取和插入所需的最小调用次数?可能重复@Dukeling:事实上,这两个问题是相同的。没有找到原来的问题是我的错。然而,鉴于已经有了答案,我们不要删除这个问题。