Потрясающий
факт: добавлением пары строчек в алгоритм,
мы сокращаем время выполнения с 30 лет
до 6 секунд!
Было
public void union(int p, int q) { int rootP = find(p); int rootQ = find(q); parent[rootP] = rootQ; } public int find(int p) { while (p != parent[p]) p = parent[p]; return p; }
Стало
public void union(int p, int q) { int rootP = find(p); int rootQ = find(q); if (size[rootP] < size[rootQ]) { parent[rootP] = rootQ; size[rootQ] += size[rootP]; } else { parent[rootQ] = rootP; size[rootP] += size[rootQ]; } } public int find(int p) { while (p != parent[p]) { parent[p] = parent[parent[p]]; p = parent[p]; } return p; }
Это из проблемы
Union-Find, где надо определять/задавать
принадлежность объектов одному/разным
наборам.
Если взять
миллиард (10^9) объектов и выполнить над
ними 10^9 операций Union-Find, то в первом
случае (Quick-Union UF) ждать придется 30 лет.
А во втором
случае (Weighted Quick-Union with Path Compression UF) задача
будет выполнена через 6 секунд.
Потрясающе.
Вот так всю
жизнь используешь алгоритмы/структуры
и знать не знаешь, какие страшные тайны
скрыты под поверхностью.
А ведь я помню,
как радовался народ, когда я чутка
переписал алгоритм рассчета полигонов
(древняя ГИС на древнем Автокаде) и
вместо часов ожидания мы получали
результат через секунды.
Но с 30 лет до
6 секунд парой строк? Это потрясающе.
original post http://vasnake.blogspot.com/2016/01/wqupc-reduces-time-from-30-years-to-6.html
Комментариев нет:
Отправить комментарий