Эффективная структура данных для вставки, удаления и поиска - PullRequest
0 голосов
/ 29 июня 2018

Мне нужно отслеживать открытые и закрытые состояния при использовании определенных ресурсов. Первая структура, которую я использовал, это две open_states_list и closed_states_list, которые я добавляю и удаляю по мере обновления состояний.

  • Вставка - это O (1), если мы игнорируем механизм выделения и перераспределения внутренней памяти, я думаю: open_states_list.append(x).
  • Удаление O (n): open_states_list.remove(x).
  • Поиск, как и удаление, - это O (n): x in open_states_list.
  • Получение списка, очевидно, O (1).

Вторая структура, которую я использовал, представляет собой один словарь с логическими значениями open_states = {}, где, если open_states[x] равно True, то x открыто, а если False, то оно закрыто.

  • «Вставка» - это O (1), так как мы просто устанавливаем ключ и значение: open_states[x] = True.
  • «Удаление» равно O (1) по той же причине: open_states[x] = False.
  • «Поиск» - это также O (1), просто доступ к значению ключа: open_states[x].
  • Получение списка O (n): [x for x, s in open_states.iteritems() if s].

Наша самая распространенная операция - проверка, открыт ли x или нет (поиск), поэтому второй вариант лучше. Но наша вторая наиболее распространенная операция, получение списков открытых или использованных состояний, очень близко следует за операцией поиска, более эффективна в первом варианте. Мы не можем выбрать первый вариант, потому что проверка состояния ресурса - это O (n).

Вставка тоже очень распространена. Удаление не так важно.

Какая структура данных будет наиболее эффективной для этих нужд?

...