我写了一个算法来计算整数数组的下一个词典排列(例如,123,132,213,231,312,323)。我不认为代码是必要的,但我将其包含在下面。
我认为我已经适当地确定了O(n)的最坏情况时间成本,其中n是数组中元素的数量。我理解,如果你使用“摊还成本”,你会发现时间成本可以准确地显示为平均情况下的O(1)。
问题:
我想学习“会计方法”,将其显示为O(1)但很难理解如何为每项操作应用成本。会计方法:Link: Accounting_Method_Explained
思想:
我认为应用在某个位置更改价值或将成本应用于交换的成本。但它真的没有多大意义。
public static int[] getNext(int[] array) {
int temp;
int j = array.length - 1;
int k = array.length - 1;
// Find largest index j with a[j] < a[j+1]
// Finds the next adjacent pair of values not in descending order
do {
j--;
if(j < 0)
{
//Edge case, where you have the largest value, return reverse order
for(int x = 0, y = array.length-1; x<y; x++,y--)
{
temp = array[x];
array[x] = array[y];
array[y] = temp;
}
return array;
}
}while (array[j] > array[j+1]);
// Find index k such that a[k] is smallest integer
// greater than a[j] to the right of a[j]
for (;array[j] > array[k]; k--,count++);
//Swap the two elements found from j and k
temp = array[k];
array[k] = array[j];
array[j] = temp;
//Sort the elements to right of j+1 in ascending order
//This will make sure you get the next smallest order
//after swaping j and k
int r = array.length - 1;
int s = j + 1;
while (r > s) {
temp = array[s];
array[s++] = array[r];
array[r--] = temp;
}
return array;
} //结束getNext
答案 0 :(得分:1)
array[j]
和array[k]
的交换具有虚拟成本2.其他交换具有虚拟成本0.因为每次迭代最多一次交换是昂贵的,所以每次迭代的运行时间是分摊的常量(假设我们不负债)。array[j]
和array[k]
的交换在位置j
留下信用额度就足够了涉及可获得信用的职位,该职位被消费。案例分析和归纳显示,在迭代之间,如果某个项目大于紧随其后的项目,那么它将通过交换放入其当前位置,该交换留下了尚未消耗的信用。j
使array[j] > array[j + 1]
。答案 1 :(得分:0)
从聚合分析中,我们看到T(n)&lt; N! ·e&lt; N! ·3,所以我们为每个操作支付3美元,并且它足够用于总n!操作。因此它是实际成本的上限。所以摊销总额