ITeration_Test, Со string у вас тут никах проблем нет. Более того, никакой "ссылки на строку" у вас там нет. Строка передается по значению.
Проблема в каком-то другом месте, которое вы в вопросе не привели. Судя по использованию указателей, скорее всего у вас там проблема работы с памятью и вы не выделяете объект где-то и программа падает, как только вы пытаетесь записать туда строку.
И вообще, инициализация сделана ужасно криво. Если это C++, то заведите конструктор ну или метод в структуре. Или вообще используйте obj.url = "0.png";.
Сергей Горностаев, Вот в C++ основная часть решения действительно есть в библиотеке. Наверняка такое и в питоне есть. Но количества все равно придетется руками считать.
res2001, Вы правы про замену хеш таблицы на массив из 20000 элементов. Это будет, несоменно, быстрее. Но про QuickSelect - как раз и нужно, чтобы он частично отсортировал массив. Надо же в задаче выдать не k-ый с конца, а все k максимальных элемента. И QuickSelect, если его попросить k-ый c конца элемент, как раз положит максимальные k-1 справа от него. Ровно как в задаче и надо. И все это за O(n) в среднем.
Adamos, ох, позор мне: с битами напутал. Пхп может это соптимизировать, если функция встроенная. А вообще, может какая-то встроенная процедура в БД будет быстрее работать.
mayton2019, весьма отдаленно. Только тем, что и там и тут есть какая-то метрика близости строк. Только тут вот метрику подсчитать надо, а в задачах кластеризации считается, что метрика вам дана. Так что никакие алгоритмы кластеризации тут никак не применить.
Adamos, заведите таблицу на 32768 чисел. Для каждой позиции предподсчитайте количество единичных бит. Прибавляйте значения из таблицы для каждой четвертинки из 16 бит. А вообще, в php наверняка есть встроенная функция popcnt, которая быстро подсчитает биты.
Неясно, как это аггрегированное количество нулей во всех строках позволит найти строки, где на заданных позициях 0. Если только вы не предлагаете предподсчитывать количество нулей для всех строк на каждом подмножестве позиций.
Adamos, оптимизация в том, что вы 64 символа сравниваете одной процессорной операцией. Пример: вместо 4 сравнений "0001" с "1000" вы or-ите числа 14 и 7, получая 15 за одну операцию. Потом еще за 4 операции (для 64 бит) вы найдете, что там 4 единичных бита, т.е. в 4 позициях нули есть хотя бы в одной строке. Важно строки перевести в числа до запихивания в бд, если переводить в биты каждый раз, то да, никакого ускорения не будет.
Проблема в каком-то другом месте, которое вы в вопросе не привели. Судя по использованию указателей, скорее всего у вас там проблема работы с памятью и вы не выделяете объект где-то и программа падает, как только вы пытаетесь записать туда строку.
И вообще, инициализация сделана ужасно криво. Если это C++, то заведите конструктор ну или метод в структуре. Или вообще используйте
obj.url = "0.png";
.