使用会计方法摊销时间成本

时间:2012-03-05 00:38:02

标签: algorithm methods time-complexity account amortized-analysis

我写了一个算法来计算整数数组的下一个词典排列(例如,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

2 个答案:

答案 0 :(得分:1)

  1. 测量交换中的运行时间,因为每次迭代的其他工作是最坏情况O(#swaps)。
  2. array[j]array[k]的交换具有虚拟成本2.其他交换具有虚拟成本0.因为每次迭代最多一次交换是昂贵的,所以每次迭代的运行时间是分摊的常量(假设我们不负债)。
  3. 为了证明我们没有负债,只要表明array[j]array[k]的交换在位置j留下信用额度就足够了涉及可获得信用的职位,该职位被消费。案例分析和归纳显示,在迭代之间,如果某个项目大于紧随其后的项目,那么它将通过交换放入其当前位置,该交换留下了尚未消耗的信用。
  4. 考虑到可以使用的相对简单的潜在功能,这个问题不是会计方法的理想选择:索引数j使array[j] > array[j + 1]

答案 1 :(得分:0)

从聚合分析中,我们看到T(n)&lt; N! ·e&lt; N! ·3,所以我们为每个操作支付3美元,并且它足够用于总n!操作。因此它是实际成本的上限。所以摊销总额