Амортизированная временная стоимость с использованием метода учета - PullRequest
1 голос
/ 05 марта 2012

Я написал алгоритм для вычисления следующей лексикографической перестановки массива целых чисел (например, 123, 132, 213, 231, 312,323).Я не думаю, что код необходим, но я включил его ниже.

Я думаю, что я правильно определил наименьшую стоимость времени O (n), где n - количество элементов в массиве.Однако я понимаю, что если вы используете «Амортизированную стоимость», вы обнаружите, что стоимость времени может быть точно показана в среднем как O (1).

Вопрос:

Я хотел бы узнать«МЕТОД УЧЕТА», чтобы показать это как O (1), но мне трудно понять, как применить стоимость к каждой операции.Метод учета: Ссылка: 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;

} // end getNext

Ответы [ 2 ]

1 голос
/ 05 марта 2012
  1. Измерение времени работы в свопах, так как другая работа за итерацию - наихудший O (#swaps).
  2. Своп для array[j] и array[k] имеет виртуальную стоимость 2. Другие свопы имеют виртуальную стоимость 0. Поскольку не более одного свопа на итерацию является дорогостоящим, время выполнения на итерацию амортизируется постоянной (при условии, что мы не не влезать в долги).
  3. Чтобы показать, что мы не влезаем в долги, достаточно показать, что, если своп array[j] и array[k] оставляет кредит на позиции j, тогда любой другой своп включает позицию с кредитом доступно, что потребляется. Анализ случая и индукция показывают, что между итерациями, если элемент больше, чем тот, который следует сразу за ним, он был помещен в его текущую позицию путем обмена, который оставил еще не использованный кредит.
  4. Эта проблема не является хорошим кандидатом для метода учета, учитывая сравнительно простую потенциальную функцию, которую можно использовать: количество индексов j, таких что array[j] > array[j + 1].
0 голосов
/ 22 марта 2012

Из совокупного анализа мы видим, что T (n)

...