Динамический массив с O (1) удаление любого элемента

Пример, сделанный мной с использованием прокрутки (только HTML, CSS и JS, только с библиотекой jquery). При прокрутке вниз кнопка сдвигается влево.

Кроме того, я предлагаю вам, если вам нужен только этот эффект, не используйте jQuery UI, потому что он слишком тяжелый (если вы просто хотите использовать его для этого).

$(window).scroll(function(){
  if ($(this).scrollTop() > 100) {
          event.preventDefault();
          $(".scrollToTop").css({'transform': 'translate(0px, 0px)'});
      } else {
          $(".scrollToTop").css({'transform': 'translate(40px, 0px)'});
      }
  });

Отметьте этот пример

5
задан GManNickG 29 June 2009 в 08:22
поделиться

6 ответов

Эта идея используется в перемешивании Кнута (Фишера – Йейтса) . Случайно выбранный элемент заменяется последним в массиве. Поскольку в любом случае нам нужна случайная перестановка, перестановка не имеет значения.

5
ответ дан 14 December 2019 в 04:45
поделиться

Итак, у этой странной / бесполезной структуры есть имя и есть ли у нее какое-то применение?

Я использовал нечто подобное при моделировании многопроцессорных систем.

В планировщик для процессов, реализованный как конечные автоматы, каждый процесс либо ожидает внешнего события, активного или завершенного. В планировщике есть массив указателей на процессы.

Первоначально каждый процесс активен, и у планировщика есть индекс последнего ожидающего и первого завершенного процесса, изначально равный нулю, и длина массива.

V-- waiting
[ A-active, B-active, C-active, D-active ]
                             completed --^
^- run

Чтобы перевести процесс в его следующее состояние, планировщик выполняет итерацию по массив и запускает каждый процесс по очереди. Если процесс сообщает, что он ожидает, он заменяется процессом после последнего ожидающего процесса в массиве.

           V-- waiting
[ A-waiting, B-active, C-active, D-active ]
                              completed --^
             ^- run

Если он сообщает, что он завершен, это ' s заменяется процессом перед первым завершенным массивом.

           V-- waiting
[ A-waiting, D-active, C-active, B-completed ]
                   completed --^
             ^- run

Таким образом, когда планировщик запускается и обрабатывает переход от активного к ожидающему или завершенному, массив становится упорядоченным со всеми ожидающими процессами в начале, всеми активными в середине и завершенными в конце.

                      V-- waiting
[ A-waiting, C-waiting, D-active, B-completed ]
                   completed --^
                        ^- run

Либо после определенного количества итераций, либо когда больше нет активных процессов, завершенные процессы удаляются из массива и обрабатываются внешние события:

                      V-- waiting
[ A-waiting, C-waiting, D-completed, B-completed ]
          completed --^
                        ^- run == completed so stop

Это похоже на то, что используется замена для удаления элементов из коллекции, но он скорее удаляет элементы с обоих концов и оставляет «коллекцию» посередине.

массив становится упорядоченным со всеми ожидающими процессами в начале, всеми активными в середине и завершенными в конце.

                      V-- waiting
[ A-waiting, C-waiting, D-active, B-completed ]
                   completed --^
                        ^- run

После определенного количества итераций или когда активных процессов больше нет, завершенные процессы очищаются из массива и обрабатываются внешние события:

                      V-- waiting
[ A-waiting, C-waiting, D-completed, B-completed ]
          completed --^
                        ^- run == completed so stop

Это похоже на то, что он использует замену для удаления элементов из коллекции, но он удаляет элементы с обоих концов и оставляет «коллекцию» посередине .

массив становится упорядоченным со всеми ожидающими процессами в начале, всеми активными в середине и завершенными в конце.

                      V-- waiting
[ A-waiting, C-waiting, D-active, B-completed ]
                   completed --^
                        ^- run

После определенного количества итераций или когда активных процессов больше нет, завершенные процессы очищаются из массива и обрабатываются внешние события:

                      V-- waiting
[ A-waiting, C-waiting, D-completed, B-completed ]
          completed --^
                        ^- run == completed so stop

Это похоже на то, что он использует замену для удаления элементов из коллекции, но он удаляет элементы с обоих концов и оставляет «коллекцию» посередине .

но он скорее удаляет элементы с обоих концов и оставляет «коллекцию» посередине.

но он скорее удаляет элементы с обоих концов и оставляет «коллекцию» посередине.

3
ответ дан 14 December 2019 в 04:45
поделиться

Я помню, как раньше уже много раз использовал этот метод. Но я не знаю, как это называется.

Простой пример: в компьютерной игре вы повторяете всех «плохих парней», вычисляете их движения и т. Д. С ними может случиться одна вещь - исчезнуть (их труп закончил исчезать и теперь прозрачен на 99%). В этот момент вы удаляете его из списка, как вы это делаете, и возобновляете итератор, не увеличивая счетчик итераций.

Нечто подобное делается в двоичной куче при удалении элемента, однако есть следующий шаг заключается в поддержании правила кучи - O (log n).

2
ответ дан 14 December 2019 в 04:45
поделиться

Хм, этот алгоритм действительно имеет время удаления O (1)?

Это означает, что

  1. Поиск элемента для удаления составляет O (1)
  2. Поиск последнего элемент (который заменит удаленный элемент) - O (1)
  3. Поиск предпоследнего элемента (новый «последний» элемент) - O (1)

... что невозможно ни в одном структура данных, которую я могу придумать. Хотя двусвязный список может удовлетворить эти ограничения, если у вас уже есть указатель на элемент, который нужно удалить.

-1
ответ дан 14 December 2019 в 04:45
поделиться

Это называется Set .

-1
ответ дан 14 December 2019 в 04:45
поделиться
[

] Я не знаю, как его называть, но в некоторых случаях это лучше, чем список.[

] [

] В частности, это было бы намного лучше, чем однократный или двукратный список для очень маленьких данных. Потому что вы храните все непрерывно, и на каждый элемент нет лишних указателей. [

]
0
ответ дан 14 December 2019 в 04:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: