Лучший способ удалить запись из хэш-таблицы

После назначения this.reportData вы хотите дать Angular шанс обновить DOM, прежде чем начинать запрашивать дочерние узлы.

Вы можете позвонить ChangeDetectorRef.detectChanges() , чтобы запустить прогон обнаружения изменений, прежде чем запрашивать обновленный DOM:

constructor(private cd: ChangeDetectorRef, private sanitizer: DomSanitizer) {}

// ...

this.reportData = this.sanitizer.bypassSecurityTrustHtml(html);

// Update the DOM
this.cd.detectChanges();

// Now we can access the updated DOM
console.log(this.reportDisplayHost.nativeElement.querySelector('chart'));

А вот пример StackBlitz .

22
задан ashokgelal 10 November 2008 в 23:27
поделиться

4 ответа

Реализация хэш-таблицы Python (спорный очень быстрый) использует фиктивные элементы для маркировки удалений. Как Вы растете или уменьшаетесь или таблица (предполагающий, что Вы не делаете таблицы фиксированного размера), можно отбросить макеты одновременно.

, Если у Вас есть доступ к копии, взгляните на статью в Красивый Код о реализации.

9
ответ дан 29 November 2019 в 03:53
поделиться

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

  • Если вы можете использовать неконстантный итератор (например, C ++ STL или Java), вы сможете удалить их по мере необходимости. столкнуться с ними. Предположительно, однако, вы бы не задавали этот вопрос, если бы вы не использовали константный итератор или перечислитель, который был бы недействительным, если базовая коллекция была изменена.
  • Как вы сказали, вы можете пометить удаленный флаг внутри содержащегося объекта. Это не освобождает память и не уменьшает количество коллизий на ключе, так что это не лучшее решение. Также требует добавления свойства к классу, которое, вероятно, на самом деле не принадлежит там. Если это беспокоит вас так же сильно, как и меня, или если вы просто не можете добавить флаг к хранимому объекту (возможно, вы не управляете классом), вы можете сохранить эти флаги в отдельной хеш-таблице. Это требует самого длительного использования памяти.
  • Вставьте ключи удаляемых элементов в список векторов или массивов при обходе хеш-таблицы. После освобождения перечислителя, переберите этот вторичный список и удалите ключи из хеш-таблицы. Если у вас есть много предметов, которые нужно удалить, и / или ключи большие (которых не должно быть), это может быть не лучшим решением.
  • Если вы собираетесь в конечном итоге удалить из хеш-таблицы больше элементов, чем оставляете там, может быть лучше создать новую хеш-таблицу, и по мере того, как вы переходите к исходной, добавьте новый хеш-таблицу. стол только предметы, которые вы собираетесь сохранить. Затем замените ваши ссылки на старую хеш-таблицу новой. Это сохраняет вторичную итерацию списка, но, вероятно, она эффективна только в том случае, если в новой хеш-таблице будет значительно меньше элементов, чем в исходной, и она определенно работает только в том случае, если вы, конечно, можете изменить все ссылки на исходную хеш-таблицу.
  • Если ваша хеш-таблица дает вам доступ к ее коллекции ключей, вы можете выполнять их итерацию и удалять элементы из хеш-таблицы за один проход.
  • Если ваша хеш-таблица или какой-либо помощник в вашей библиотеке предоставляют вам модификаторы коллекции на основе предикатов, у вас может быть функция Remove (), в которую можно передать лямбда-выражение или указатель на функцию, чтобы идентифицировать элементы, которые нужно удалить.
3
ответ дан 29 November 2019 в 03:53
поделиться

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

1
ответ дан 29 November 2019 в 03:53
поделиться

Это зависит от того, как Вы обрабатываете переполнение и ли (1) удаляемый объект находится в слоте переполнения или не и (2) если существуют объекты переполнения вне удаляемого объекта, есть ли у них ключ хеша удаляемого объекта или возможно некоторый другой ключ хеша. [Забыв, что двойное условие является общим источником ошибок в реализациях удаления.]

, Если коллизии переполняются в связанный список, это довольно легко. Вы или открываетесь список (который, возможно, пошел пустой), или удаление участника с середины или конца связанного списка. Те - забава и не особенно трудные. Может быть другая оптимизация для предотвращения чрезмерных выделений памяти и освобождения для создания этого еще более эффективным.

Для линейного зондирования, Knuth предлагает, чтобы простой подход имел способ отметить слот как пустой, удаленный или занятый. Mark удаленный слот жителя, как удалено так, чтобы переполнение линейным зондированием пропустило мимо него, но если вставка необходима, можно заполнить первый удаленный слот, который Вы прошли по [Искусство Программирования, vol.3: Сортируя и Поиск, разделите 6.4 Хеширований, p. 533 (редактор 2)]. Это предполагает, что удаления довольно редки.

Knuth дает хорошее улучшение как Алгоритм R6.4 [стр 533-534], который вместо этого отмечает ячейку как пустую, а не удаленную, и затем находит способы подвинуть записи таблицы поближе назад к их начально-тестовому местоположению путем перемещения дыры, которая была просто сделана, пока это не заканчивается рядом с другой дырой.

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

14
ответ дан 29 November 2019 в 03:53
поделиться
Другие вопросы по тегам:

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