=QUERY(QUERY(ARRAYFORMULA(TRANSPOSE(SPLIT(JOIN(" ",
QUERY(A1:T25, , 10000)), " "))),
"select Col1,count(Col1) group by Col1 label count(Col1)''"),
"order by Col2 desc")
Я нашел этот интересный комментарий здесь о нахождении циклов в DAG:
Steinar H. Gunderson записал:
В четверг, 26 февраля 2004 0:28:32 +0100, Orlondow записал:
... также воспроизведенный в Cormen-Leiserson-Rivest, IIC. Который является самым легким найти.
Да, у меня на самом деле есть Cormen и др., но он никогда не ударял меня для поиска "сильно соединенных компонентов", когда я хотел обнаружение цикла. Спасибо, я взгляну на него.:-)
Для нахождения цикла в ориентированном графе (Вы не заботитесь, который циклом) как долго как там существует один, Вы не должны идти за борт с SCC. Простой поиск в глубину DFS (в той же главе СБРАСЫВАЕТ) достаточно.
Так, примерно разговор, в то время как Вы пересекаете дерево каталогов, создает DAG, который представляет структуру дерева с данными в узле, относящемся к inode файла. Затем Вы просто проверяете, чтобы удостовериться, что Вы не посещаете узел несколько раз.
Простой путь. Просто сделайте обход дерева в глубину дерева каталогов, сохранив стопку узлов выше Вас, когда Вы идете. В каждом узле Вы посещаете, если тот узел уже находится в стеке, у Вас есть цикл.
// here's a stack of nodes
node stack[1000];
walk(node, level){
if (node in stack[0..level-1]) then there is a cycle
else
stack[level] = node
for each subnode x of node
walk(x, level+1)
}
Возможно, я немного тускл здесь, но не являюсь этими двумя способами, которыми Вы могли создать цикл:
Для контакта с ними можно получить список монтирования, прежде чем Вы начнете индексировать и ifnore все кроме первой из той же фс, и можно проигнорировать ссылки, поскольку Вы сталкиваетесь с ними в процессе индексации.
Это более обычно упоминается как "цикл". Таким образом, Вы хотите реализовать "обнаружение цикла". Существует много способов сделать это; я не знаю, ли это для домашней работы или не, но одно простое, не обязательно самое оптимальное, метод посредством преследования указателя.
Как другие сказали, нет такой вещи как цикл в файловой системе, если Вы понимаете, что путь является частью имени файла, если это не циклическая символьная ссылка.
Например, если Вы загружаетесь, некоторый дистрибутив (позволяет, говорят, что Debian), к циклическому устройству, или даже к каталогу, и делают это НА машине Debian, Вы теперь копировали много вещей.
Например, позволяет, говорят, что Вы выполняете Debian Lenny и загружаете минимальную копию ее к/lenny.
/lenny/usr /* собирается совпасть с/usr /*. Нет никакого 'дешевого' способа избежать этого.
Так как Вы уже называете статистику () на каждом узле (я предполагаю, что Вы используете ftw () / ftw64 (), Вы можете также:
Это не находится ни в какой опасности ускорить Ваше сканирование, но оно значительно сократит вовремя, оно берет для поиска.
Если Вы используете потоки правильно и устанавливаете привязку, хеширование и индексация могут произойти на одном ядре, в то время как другой связанный i/o (когда несколько ядер доступны).
Однако 'просто' проверка дубликат монтируется, не будет средством исправления, плюс я уверен, что Ваша программа хотела бы возвратить местоположения всех файлов, названных 'нечто', даже если существует четыре идентичных копии для упоминания.
Общий способ предотвратить узлы повторного сканирования в графике состоит в том, чтобы отметить узлы, поскольку Вы передаете их и затем игнорируете узлы, которые отмечены. Это не ужасно практично, если Вы не хотите изменять график, Вы сканируете, таким образом, Вам нужен способ отметить узлы внешне. Самым легким путем я могу думать, чтобы сделать, это в соответствии с Linux должно было бы сохранить device/inode для каждого каталога, который Вы посещаете. Затем при рассмотрении каталога сначала проверьте, что Вы уже не видели каталогов с тем же device/inode. Это не только обрабатывает циклы, но также и деревья, которые объединяются назад друг в друга.
Для получения device/inode числа смотрят на функции stat/fstat и st_dev и st_ino членов структуры статистики.
Для того, чтобы хранить данные, Вы, вероятно, желаете посмотреть на хеш-таблицу или двоичное дерево.