Вместо функции strcasecmp, вам надо подставить библиотечную функцию, возвращающую расстояние между картинками.
После этого взять проход, который я привел в самом начале, в котором группируются элементы, где вместо abs будет использоваться опять таки функция определения расстояния.
ну так напишите, что не понимаете, полагаете лучше игнорировать?
Еще раз, в php есть функция: http://php.net/manual/en/function.uksort.php, в которую нужно скормить ваш массив элементов и компаратор принимающий пару элементов, внутри которого будет ваша функция определения расстояния отдавать ответ. Нужно посмотреть каким образом будет отсортировано множество и окажутся ли все похожие картинки рядом в этом массиве элементов. Если все получится, ваша проверка на количестве элементов более 100к будет работать во много раз ( N^2 / (N*ln(N)+N) ) быстрее.
Mad_Man: А что он сортировать будет? У него поля сигнатур - это хэши изображений в виде строки, а схожесть определяется внешней либой при сравнении хэшей попарно. Результат сравнения - значение вероятности от 0 до 1 включительно с обеих сторон. А вы и вовсе разность рандомных чисел с 10 зачем-то сравниваете :-\
сортировать он будет расстояния между элементами, тут возможность сортировки определяется каким именно образом определяется расстояние между элементами. Сравнение с 10 это как пример выделения элементов в группы, т.к. подробностей сравнения не было, вместо сравнения с 10 нужно использовать функцию определения расстояния между элементами, но делать это нужно на упорядоченном множестве.
Mad_Man: У топикстартера речь была о неких мифических 10% между каждым значением
это понятно, но я предполагал если элементы отсортировать то они отсортируются по "похожести", таким образом "одинаковые" ( с минимальным расстоянием ) элементы окажутся рядом и их можно будет выделить в группы. Собственно сработает или нет зависит от того как будет работать функция определения расстояния между элементами, но ТС молчит.
Дикий пионер: Где я не прав?
вы все правильно сказали
обход может быть таким:
for i in range(1, 11): for x in range(i + 1, 11): print i, x
а может таким:
for i in range(1, 11): for x in range(1, 11): print i, x
Ilekor: Друзья, в значении хранится текстовый код изображения, вот эти коды и сравниваются на похожесть кодов, вот так
сначала получаем и сравниваем sig1 и sig2, mysql такого сравнения не сделает, это функция библиотеки php
и так до тех пор пока sig1 не пройдет все значения
после чего sig2 начинает также проходить по все проверкам и так пока не закончится
Тогда если правильно понимаю мое предыдущее решение должно работать, нужно выбрать все элементы, отсортировать их по расстоянию, которое выдает функция: puzzle_vector_normalized_distance, дальше все как написал выше, делаем один проход, получится сложность: (сложность сортировки + N) * время расчета расстояния
---------- Добавлено 06.01.2015 в 02:58 ----------
Видимо не дождусь я вашего сообщения, надо спать, но опять погадаю, вероятно вам понадобится функция php: http://php.net/manual/en/function.uksort.php, в которую вы скормите ваш компаратор, таким образом получите отсортированное множество, по которому уже пробежите аналогично коду на python.
В общем не дожидаясь ответа по вангую. Если я верно понимаю задачу, то сравнивать все значения со всеми не обязательно, т.к. если упорядочить данные по некоторой сравниваемой величине, то сравнивать нужно только соседние элементы, допустим имеем упорядоченный список:
[1,2,3,4,20,24,28,40,41,50,90,100,101]
задача найти группы разность между элементами которых не более 10., тогда достаточно взять элемент и сравнивать его со следующим, пока условие не перестанет выполняться, т.е
abs(1 - 2) < 10 # да, добавляем элементы в общее множество
abs(2 - 3) < 10 # аналогично
......
abs(4-20) < 10 # нет, предыдущее множество сформировано, начинаем формировать новое
abs(20 - 28) < 10 и т.д.
таким образом задача решается в один проход, даже для кол-ва элементов более млн. все будет быстро
на python, код будет таким:
import random
# создаем тестовый список items = [1,2,3,4,20,24,28,40,41,50,90,100,101] # тестовые данные
#items = [1e10 * random.random() for x in xrange(int(1e6))] # на большом количестве данных если нужно # сортируем по возрастанию своей функцией items = sorted( items, key=lambda x: x )
similar = [] # обходим сравнивая текущий элемент со следующим for i, e in enumerate(items[:-1]): if abs(e-items) <= 10.0: if not similar: similar.append(e) similar.append( items ) else: if similar: print similar similar = []
но затык может быть в том, что множество ваше не сортируемое и условно "расстояние" элемента 1 до 10 может равняться "расстоянию" от 5 до 6, но об этом вы ничего не сказали
Отсортировал, но в лоб не пойму что мне с этим делать
в общем чуда не случилось, сортировка по расстоянию разбрасывает эти элементы в разные места, совсем не рядом, но делает это быстро :)
Вместо функции strcasecmp, вам надо подставить библиотечную функцию, возвращающую расстояние между картинками.
После этого взять проход, который я привел в самом начале, в котором группируются элементы, где вместо abs будет использоваться опять таки функция определения расстояния.
Я не могу понять Ваш вопрос!
ну так напишите, что не понимаете, полагаете лучше игнорировать?
Еще раз, в php есть функция: http://php.net/manual/en/function.uksort.php, в которую нужно скормить ваш массив элементов и компаратор принимающий пару элементов, внутри которого будет ваша функция определения расстояния отдавать ответ. Нужно посмотреть каким образом будет отсортировано множество и окажутся ли все похожие картинки рядом в этом массиве элементов. Если все получится, ваша проверка на количестве элементов более 100к будет работать во много раз ( N^2 / (N*ln(N)+N) ) быстрее.
А что он сортировать будет? У него поля сигнатур - это хэши изображений в виде строки, а схожесть определяется внешней либой при сравнении хэшей попарно. Результат сравнения - значение вероятности от 0 до 1 включительно с обеих сторон. А вы и вовсе разность рандомных чисел с 10 зачем-то сравниваете :-\
сортировать он будет расстояния между элементами, тут возможность сортировки определяется каким именно образом определяется расстояние между элементами. Сравнение с 10 это как пример выделения элементов в группы, т.к. подробностей сравнения не было, вместо сравнения с 10 нужно использовать функцию определения расстояния между элементами, но делать это нужно на упорядоченном множестве.
Ilekor, почему вы не отвечаете на вопросы?
Ilekor, ну так пробовали упорядочить массив способом, которым я попросил?
У топикстартера речь была о неких мифических 10% между каждым значением
это понятно, но я предполагал если элементы отсортировать то они отсортируются по "похожести", таким образом "одинаковые" ( с минимальным расстоянием ) элементы окажутся рядом и их можно будет выделить в группы. Собственно сработает или нет зависит от того как будет работать функция определения расстояния между элементами, но ТС молчит.
Где я не прав?
вы все правильно сказали
обход может быть таким:
а может таким:
Друзья, в значении хранится текстовый код изображения, вот эти коды и сравниваются на похожесть кодов, вот так
сначала получаем и сравниваем sig1 и sig2, mysql такого сравнения не сделает, это функция библиотеки php
и так до тех пор пока sig1 не пройдет все значения
после чего sig2 начинает также проходить по все проверкам и так пока не закончится
Тогда если правильно понимаю мое предыдущее решение должно работать, нужно выбрать все элементы, отсортировать их по расстоянию, которое выдает функция: puzzle_vector_normalized_distance, дальше все как написал выше, делаем один проход, получится сложность: (сложность сортировки + N) * время расчета расстояния
---------- Добавлено 06.01.2015 в 02:58 ----------
Видимо не дождусь я вашего сообщения, надо спать, но опять погадаю, вероятно вам понадобится функция php: http://php.net/manual/en/function.uksort.php, в которую вы скормите ваш компаратор, таким образом получите отсортированное множество, по которому уже пробежите аналогично коду на python.
В общем не дожидаясь ответа по вангую. Если я верно понимаю задачу, то сравнивать все значения со всеми не обязательно, т.к. если упорядочить данные по некоторой сравниваемой величине, то сравнивать нужно только соседние элементы, допустим имеем упорядоченный список:
задача найти группы разность между элементами которых не более 10., тогда достаточно взять элемент и сравнивать его со следующим, пока условие не перестанет выполняться, т.е
abs(1 - 2) < 10 # да, добавляем элементы в общее множество
abs(2 - 3) < 10 # аналогично
......
abs(4-20) < 10 # нет, предыдущее множество сформировано, начинаем формировать новое
abs(20 - 28) < 10 и т.д.
таким образом задача решается в один проход, даже для кол-ва элементов более млн. все будет быстро
на python, код будет таким:
вывод по данным:
но затык может быть в том, что множество ваше не сортируемое и условно "расстояние" элемента 1 до 10 может равняться "расстоянию" от 5 до 6, но об этом вы ничего не сказали
А какой тип у колонки sig и как выглядит сравнение двух значений между собой?