Предположим, у вас есть несортированный список различных предметов.например:
['a', 'z', 'g', 'i', 'w', 'p', 't']
Вы также получите список операций вставки и удаления.Операции вставки состоят из индекса для вставки и элемента для вставки.Например: Insert (5, 's')
Операции удаления выражаются с использованием элемента для удаления.Например: Удалить ('s')
Таким образом, список операций может выглядеть следующим образом:
- Вставить ('s', 5)
- Удалить ('p')
- Вставить ('j', 0)
- Удалить ('a')
Я ищу наиболее эффективный алгоритм, который можно перевестисписок операций, так что они основаны на индексе.Это означает, что нет необходимости изменять операции вставки, но операции удаления должны быть заменены операцией удаления с указанием индекса current удаляемого элемента (не исходного).
Таким образом, выходные данные примера должны выглядеть следующим образом:
- Начальный набор: ['a', 'z', 'g', 'i', 'w', 'p', 't']
- Вставка ('s', 5) (список теперь: ['a', 'z', 'g', 'i', 'w', 's', 'p ',' t ']
- Удалить (6) (список теперь: [' a ',' z ',' g ',' i ',' w ',' s ',' t ']
- Вставить ('j', 0) (список теперь: ['j', 'a', 'z', 'g', 'i', 'w', 's', 't ']
- Удалить (1) (список теперь: [' j ',' z ',' g ',' i ',' w ',' s ',' t ']
Очевидно, что мы можем сканировать следующий элемент для удаления в наборе после каждой операции, и это будет означать, что весь алгоритм будет принимать O (n * m), где n - размер списка, а mтакое количество операций.
Вопрос - есть ли более эффективный алгоритм?