На мои два цента, если вы просто пытаетесь пройти весь граф, не имеет большого значения, какой алгоритм вы используете, если он достигает каждого узла только один раз. Кажется, это то, что вы говорите, когда отмечаете:
Я просто пытаюсь пройти весь график
Это означает, что ваша терминология технически некорректна — вы говорите о обходе графика, а не о поиске на графике. Если вы на самом деле не пытаетесь найти что-то конкретное, о чем вы, кажется, вообще не упоминаете в вопросе.
С учетом сказанного, Facebook и Twitter — это очень разные графические структуры, которые действительно влияют на то, как вы их просматриваете:
Facebook — это, по сути, неориентированный граф. Если X дружит с Y, Y ДОЛЖЕН дружить с X. (Или в отношениях, или связанных с ним, и т. д.).
Twitter — это, по сути, ориентированный граф. Если вы X следует за Y, Y не обязан следовать за X.
Эти проблемы существенно повлияют на алгоритм обхода графа. Честно говоря, если вы просто хотите посетить все узлы, вам вообще нужен график? Почему бы просто не перебрать их все? Если у вас есть все узлы в некоторой структуре данных MY_DATA, которая является итерируемой, у вас может быть просто выражение генератора, подобное этому:
def nodeGenerator(MY_DATA)
for node in MY_DATA:
yield node
Ясно, что вам нужно настроить внутренние компоненты nodeGenerator, чтобы обрабатывать то, как вы на самом деле получаете доступ к узлам. При этом большинство графовых структур реализуют итератор узлов. Затем вы можете просто создать итератор в любое время, когда захотите что-то сделать с помощью:
for node in nodeGenerator(MY_DATA):
(Do something here)
Может быть, я просто упускаю суть вопроса, но в настоящее время вы задали вопрос об алгоритмах поиска без проблемы поиска. Из-за бесплатного обеда характера оптимизации и поиска ценность любого алгоритма поиска будет полностью в зависимости от проблемы поиска, которую вы пытаетесь изучить.
Это верно даже среди одного и того же набора данных. В конце концов, если бы вы искали всех, чье имя начинается с буквы D, отличным подходом было бы просто отсортировать всех по алфавиту и выполнить бинарный поиск. Если вместо этого вы пытаетесь найти степень отделения каждого от Кевина Бэкона, вам понадобится алгоритм, который начинается с мистера Бэкона и рекурсивно перебирает всех, кто его знает, и всех, кого они знают. Это обе вещи, которые вы МОЖЕТЕ делать на Facebook или Twitter, но без какой-либо конкретики действительно невозможно рекомендовать алгоритм. Следовательно, если вы ничего не знаете, просто переберите всех в виде списка. Это так же хорошо, как и все остальное. Если вы затем хотите оптимизировать, кэшируйте любые вычисления.
person
Namey
schedule
06.06.2011