iqmaker

iqmaker
Рейтинг
342
Регистрация
17.04.2012

Вместо функции strcasecmp, вам надо подставить библиотечную функцию, возвращающую расстояние между картинками.

После этого взять проход, который я привел в самом начале, в котором группируются элементы, где вместо abs будет использоваться опять таки функция определения расстояния.

Ilekor:
Я не могу понять Ваш вопрос!

ну так напишите, что не понимаете, полагаете лучше игнорировать?

Еще раз, в php есть функция: http://php.net/manual/en/function.uksort.php, в которую нужно скормить ваш массив элементов и компаратор принимающий пару элементов, внутри которого будет ваша функция определения расстояния отдавать ответ. Нужно посмотреть каким образом будет отсортировано множество и окажутся ли все похожие картинки рядом в этом массиве элементов. Если все получится, ваша проверка на количестве элементов более 100к будет работать во много раз ( N^2 / (N*ln(N)+N) ) быстрее.

Mad_Man:
А что он сортировать будет? У него поля сигнатур - это хэши изображений в виде строки, а схожесть определяется внешней либой при сравнении хэшей попарно. Результат сравнения - значение вероятности от 0 до 1 включительно с обеих сторон. А вы и вовсе разность рандомных чисел с 10 зачем-то сравниваете :-\

сортировать он будет расстояния между элементами, тут возможность сортировки определяется каким именно образом определяется расстояние между элементами. Сравнение с 10 это как пример выделения элементов в группы, т.к. подробностей сравнения не было, вместо сравнения с 10 нужно использовать функцию определения расстояния между элементами, но делать это нужно на упорядоченном множестве.

Ilekor, почему вы не отвечаете на вопросы?

Ilekor, ну так пробовали упорядочить массив способом, которым я попросил?

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


$r_sig = puzzle_vector_normalized_distance($value1['sig'], $value2['sig']);
echo $r_sig


и так до тех пор пока 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 = []

if similar:
print similar

вывод по данным:


[1, 2, 3, 4]
[20, 24, 28]
[40, 41, 50]
[90, 100, 101]

но затык может быть в том, что множество ваше не сортируемое и условно "расстояние" элемента 1 до 10 может равняться "расстоянию" от 5 до 6, но об этом вы ничего не сказали

А какой тип у колонки sig и как выглядит сравнение двух значений между собой?


find / -newermt 2015-01-01 -type f -name "*.php"
bb25:
Сочинять\придумывать мелодии, куда сложнее. Да и запоминать сложнее. Особенно если музло идет изнутри и оно в голове. С табулатуры то всякий смогёт.

Запоминать не нужно, нужно уметь писать в ноты. С табулатуры далеко не всякий "смогёт", профессионалы с табулатуры не играют, более того, в табулатурной нотации многие вещи которые применяются к нотам вообще не имеют обозначения.

bb25:
Моем мнение о "зрелости" музыканта таково. Когда человек приходит к тому, что его слух становится абсолютным (речь не о настроить гитару), когда он на слух может подобрать мелодию или исполнить ее переложив в иную тональность - вот это уже около того, что мастер!

Странное понятие об абсолютном слухе, абсолютный слух если его коротко - когда человек слышит мелодию и параллельно диктует ноты даже не прикасаясь к инструменту. А чтобы переложить в другую тональность никаким мастером быть не нужно, более того это сделает компьютер :)) есть такое понятие как транспозиция.

bb25:
Еще более профессиональный уровень, это использование кападастеров, медиаторов и навык игры рифов, соляков.
Что касается классических переборов, боев (шестерки, восьмерки и т д) и использование форматных баре и "блатных" аккордов - это еще ни о чем...

Серьезно? Кападастер и медиатор часто используют даже дети и соляки они учатся играть до многоголосых композиций, это как раз таки азы, можно играть соло capricho 24, а можно "В траве сидел кузнечик".

Не удержался, с такой уверенностью ерунду пишете.

пс:

http://www.youtube.com/watch?v=Zg-Xl5Rlxy4

http://www.youtube.com/watch?v=HO08T4ukuac

Всего: 1384