Я изучал графики в университете (как часть Discreet Math, так и в классе структуры данных). Два способа представления графов есть то плюсы и минусы следующим образом:Эффективный способ отображения графиков
- , используя матрицу для представления графа:
O(1)
времени, чтобы проверить, если подключены два узла,O(n)
времени извлечения случайного узла, подключенный к определенному узлу. - с использованием списка для представления графика:
O(1)
для извлечения случайного узла, подключенного к определенному узлу (если есть),O(n)
, чтобы проверить, связаны ли узлыi
иj
.
Это то, как мне было рассказано, как работает графическое представление. Если это , не пожалуйста, исправьте меня. Теперь, если выше верно, я хотел бы дать свое мнение .
Матрица состоит только из 0 и 1. Итак, давайте вводим строки кода в двоичные строки и в десятичные. Теперь у нас будет массив ints, где array[i]
представляет узел i
. Получение случайного узла, подключенного к узлу i
, тривиально и имеет O(1)
. Теперь, если узел i
подключен к узлу j
, это вызывает сомнения. Теперь нам нужно array[i]
(будучи int
в базе 10) конвертировать в двоичный файл и проверить, есть ли 1 на i
-м месте в двоичной строке. Это делается O(log n)
.
Мой вопрос: существуют ли еще более эффективные способы получения этого результата? Что вы думаете о моей идее?
Предположим, у вас есть номера, которые вам нужны, чтобы найти случайного соседа. Эта проблема состоит в том, чтобы найти случайное место, когда число равно 1. Назовите это число a. int neigh = = int (log (base 2) a). И вы получите самый значительный бит этого целого числа, который, безусловно, равен 1. – user3084657
@ user3084657 wat –