Здравствуйте, shrecher, Вы писали:
NBN>>1. В условиях задачи оговорены какие-то условия на данные. S>нет, как раз поэтому нужно предпологать наихудщие случаи. Т.к природа данных не указана, то выбор хеш-функции затруднен.
Для большого количества строк? Не шути, хеш в таком случае стандартное и проверенное решение.
NBN>>2. хеш со строками обычно работает великолепно S>смотря какой хеш. Конечно, можно использовать SHA256, но это будет очень медленно.
Нет необходимости.
NBN>>3. хешфункцию можно подбирать под почти любые данные. S>подбор хеш функции сделает твое решение не универсальным: одни данные — одна хеш-функция, другие данные — другая хеш-функция.
Подбор в данном случае необходим чтобы успокоить для особо нервных. В реальности никто ничего подбирать не будет.
Здравствуйте, Аноним, Вы писали:
А>У кого есть какие варианты?
хмм, это похоже на алгоритм синхронизации файлов. как раз пригодится.
1) я б их зверски пересортировал и пробежался по этим двум массивам.
можно не сортировать а выписывать по 1,2 начальных буквы(если так проще) из двух массивов. и тоже пересортировать.
2) пробегаем по полученным массивам. так как все идет по порядку можем определять выполняются ли наши условия и в каких массивах можно переходить к следующему элементы.
// блин, вот только щас заметил эти слова: added updated removed
если все сделать правильно скорость будет(примерно) офигенно быстрой. сложностей тоже вроде никаких
Римское правило. Тот, кто говорит, что Это не может быть сделано, никогда не должен мешать тому, кто Это делает.
Осень, ну вы поняли.
Зачем еще один код? А человек?
/**
@param [in] src — контейнер с большим количеством элементов уникальных по имени (name)
@param [in] dest — контейнер с большим количеством элементов уникальных по имени (name)
@param [out] added — элементы, которых нет в src, но есть в dest (сравнение по имени)
@param [out] updated — элементы, которые есть в src и в dest, но значения value отличаются
@param [out] removed — элементы, которые есть в src, но нет в dest (сравнение по имени)
*/
void merge( const Entries& src, const Entries& dest, Entries& added, Entries& updated, Entries& removed )
{
}
Здравствуйте, Аноним, Вы писали:
А>дали такую вот задачку:
А>Надо реализовать ф-цию, максимально быстро работающую и оценить ее сложность O(?).
А>tepedef std::pair<std::string /*name*/, int /*value*/> Entry; А>tepedef std::vector< Entry > Entries;
А>/** А>@param [in] src — контейнер с большим количеством элементов уникальных по имени (name) А>@param [in] dest — контейнер с большим количеством элементов уникальных по имени (name) А>@param [out] added — элементы, которых нет в src, но есть в dest (сравнение по имени) А>@param [out] updated — элементы, которые есть в src и в dest, но значения value отличаются А>@param [out] removed — элементы, которые есть в src, но нет в dest (сравнение по имени) А>*/ А>void merge( const Entries& src, const Entries& dest, Entries& added, Entries& updated, Entries& removed ) А>{ А>}
А>У кого есть какие варианты?
А как данные хранятся в векторе? Отсортированы или нет?
Теоретически нет разницы между теорией и практикой, но на практике она есть
Делаешь хеш. В качестве ключа — строка, значение — вектор Entry->second и счётчиком пересечений с dest.
Заполняешь его данными из src, счётчик делаешь равным нулю.
Потом проходишься по всем dest и делаешь сравнение. Сложность будет линейная On(src + dest).
Здравствуйте, Аноним, Вы писали:
А>дали такую вот задачку:
А>Надо реализовать ф-цию, максимально быстро работающую и оценить ее сложность O(?).
А>tepedef std::pair<std::string /*name*/, int /*value*/> Entry; А>tepedef std::vector< Entry > Entries;
А>/** А>@param [in] src — контейнер с большим количеством элементов уникальных по имени (name) А>@param [in] dest — контейнер с большим количеством элементов уникальных по имени (name) А>@param [out] added — элементы, которых нет в src, но есть в dest (сравнение по имени) А>@param [out] updated — элементы, которые есть в src и в dest, но значения value отличаются А>@param [out] removed — элементы, которые есть в src, но нет в dest (сравнение по имени) А>*/ А>void merge( const Entries& src, const Entries& dest, Entries& added, Entries& updated, Entries& removed ) А>{ А>}
А>У кого есть какие варианты?
а что должна делать функция? составить последние 3 множества? если да, то почему merge?
Re[2]: Задача на собеседовании
От:
Аноним
Дата:
19.07.08 07:08
Оценка:
Здравствуйте, seimur, Вы писали:
S>Здравствуйте, Аноним, Вы писали:
S>А как данные хранятся в векторе? Отсортированы или нет?
нет
Re[2]: Задача на собеседовании
От:
Аноним
Дата:
19.07.08 07:14
Оценка:
Здравствуйте, NikeByNike, Вы писали:
NBN>Здравствуйте, Аноним, Вы писали:
NBN>Делаешь хеш. В качестве ключа — строка, значение — вектор Entry->second и счётчиком пересечений с dest.
— Это не очень понял, src каждому имени соотв только 1 Entry. Аналогично в dest NBN>Заполняешь его данными из src, счётчик делаешь равным нулю. NBN>Потом проходишься по всем dest и делаешь сравнение. Сложность будет линейная On(src + dest).
— А сложность вставки в хеш тут учитывается?
Re[2]: Задача на собеседовании
От:
Аноним
Дата:
19.07.08 07:24
Оценка:
Здравствуйте, ilnar, Вы писали:
I>а что должна делать функция? составить последние 3 множества?
да
если да, то почему merge?
не знаю, так назвали, суть не в этом
Здравствуйте, NikeByNike, Вы писали:
NBN>Здравствуйте, Аноним, Вы писали:
NBN>Делаешь хеш. В качестве ключа — строка, значение — вектор Entry->second и счётчиком пересечений с dest. NBN>Заполняешь его данными из src, счётчик делаешь равным нулю. NBN>Потом проходишься по всем dest и делаешь сравнение. Сложность будет линейная On(src + dest).
Вообще то 2 хэша понадобиться..
Теоретически нет разницы между теорией и практикой, но на практике она есть
А>>У кого есть какие варианты?
sch>Сортируешь оба массива, находишь нужные данные двухпутевым слиянием. Получится O(N * log N + M * log M + N + M).
А если оба массива изначально отсортерованы по убыванию??? Если я не ошибаюсь у QuickSort в таком случае ассимптотика не N*log(N), а N^2 — худший случай..
Теоретически нет разницы между теорией и практикой, но на практике она есть
Здравствуйте, seimur, Вы писали:
S>А если оба массива изначально отсортерованы по убыванию??? Если я не ошибаюсь у QuickSort в таком случае ассимптотика не N*log(N), а N^2 — худший случай..
Здравствуйте, seimur, Вы писали:
NBN>>Делаешь хеш. В качестве ключа — строка, значение — вектор Entry->second и счётчиком пересечений с dest. NBN>>Заполняешь его данными из src, счётчик делаешь равным нулю. NBN>>Потом проходишься по всем dest и делаешь сравнение. Сложность будет линейная On(src + dest).
S>Вообще то 2 хэша понадобиться..
Зачем? После того как src захеширован — мы можем просто пройтись в цикле по всем элементам dst:
если данный элемент dst не найден в хеше — помещаем в аддед.
иначе увеличиваем счётчик хешзначения на единицу.
и помещаем данный элемент dst в упдейтед.
когда цикл пройден — проходимся по всем элементам хеша, если счётчик равен нулю — помещаем элемент в removed, иначе в updated.
O(N(src)) на добавление в хеш
O(N(dst)) на цикл
O(N(src)) на постобработку
Здравствуйте, shrecher, Вы писали:
S>Это все будет работать если мало коллизий для hash-функции, это сильно зависит какие данные и какая функция.
Ну и что?
1. В условиях задачи оговорены какие-то условия на данные.
2. хеш со строками обычно работает великолепно
3. хешфункцию можно подбирать под почти любые данные.
Здравствуйте, NikeByNike, Вы писали:
NBN>Здравствуйте, shrecher, Вы писали:
NBN>1. В условиях задачи оговорены какие-то условия на данные.
нет, как раз поэтому нужно предпологать наихудщие случаи. Т.к природа данных не указана, то выбор хеш-функции затруднен.
NBN>2. хеш со строками обычно работает великолепно
смотря какой хеш. Конечно, можно использовать SHA256, но это будет очень медленно.
NBN>3. хешфункцию можно подбирать под почти любые данные.
подбор хеш функции сделает твое решение не универсальным: одни данные — одна хеш-функция, другие данные — другая хеш-функция.
NikeByNike пишет:
> Делаешь хеш. В качестве ключа — строка, значение — вектор Entry->second > и счётчиком пересечений с dest.
Хэш — конечно хорошо, но
1) нет стандартного контейнера
2) алгоритм поиска в хэш-таблице статистически может быть нестабильной.
Могут быть провалы в линейный поиск. В итоге весь алгоритм ваш вывалится
в O(N**2)
Поэтому вы бы должны были заменить хэш — таблицу на std::map
А ежели так — будет O(log N). А ежели так, то можно
и просто отсортировать вектора.
Здравствуйте, MasterZiv, Вы писали:
MZ>Хэш — конечно хорошо, но MZ>1) нет стандартного контейнера
Где то есть. В любом случае он пишется на раз.
MZ>2) алгоритм поиска в хэш-таблице статистически может быть нестабильной. MZ>Могут быть провалы в линейный поиск. В итоге весь алгоритм ваш вывалится MZ>в O(N**2)
Табличная сложность хеша O(N). O(N^2) это лично ваши выдумки.
MZ>Поэтому вы бы должны были заменить хэш — таблицу на std::map
Не должен. Лучше хеша в данном конкретном случае ничего нет.
MZ>А ежели так — будет O(log N). А ежели так, то можно MZ>и просто отсортировать вектора.
Можно и не сортировать, всёраавно решение с сортировкой неоптимальное
NikeByNike пишет:
> MZ>1) нет стандартного контейнера > Где то есть. В любом случае он пишется на раз.
Нету.
> MZ>2) алгоритм поиска в хэш-таблице статистически может быть нестабильной. > MZ>Могут быть провалы в линейный поиск. В итоге весь алгоритм ваш вывалится > MZ>в O(N**2) > Табличная сложность хеша O(N). O(N^2) это лично ваши выдумки.
сложность поиска в хэше O(1) (константа то есть). Если поиск
срывается в последовательный перебор, то получается O(N).
А поиск вы будете делать N раз. Итого, весь алгоритм — O(N**2).
Где я что выдумал ?
> Можно и не сортировать, всёраавно решение с сортировкой неоптимальное
Здравствуйте, MasterZiv, Вы писали:
>> MZ>1) нет стандартного контейнера >> Где то есть. В любом случае он пишется на раз.
MZ>Нету.
Во-первых он есть в некоторых реализация stl, в частности по моему в StlPort, и STL вижалки.
Во-вторых скорость его написания на основе того же вектора всёравно никто не отменял.
>> MZ>2) алгоритм поиска в хэш-таблице статистически может быть нестабильной. >> MZ>Могут быть провалы в линейный поиск. В итоге весь алгоритм ваш вывалится >> MZ>в O(N**2) >> Табличная сложность хеша O(N). O(N^2) это лично ваши выдумки.
MZ>сложность поиска в хэше O(1) (константа то есть). Если поиск MZ>срывается в последовательный перебор, то получается O(N). MZ>А поиск вы будете делать N раз. Итого, весь алгоритм — O(N**2). MZ>Где я что выдумал ?
_Если_ срывается. Для этого нет никаких оснований.
Практическая — та самая O(1) ( я чуть ошибся в формулировке ). И так же практически это самый быстрый алгоритм.
>> Можно и не сортировать, всёраавно решение с сортировкой неоптимальное MZ>Ну, докажите.
Уже доказано, смотри сложности алгоритмов. O( Src + Dst ) быстрее всего.
Здравствуйте, Аноним, Вы писали:
А>дали такую вот задачку:
А>Надо реализовать ф-цию, максимально быстро работающую и оценить ее сложность O(?).
А>tepedef std::pair<std::string /*name*/, int /*value*/> Entry; А>tepedef std::vector< Entry > Entries;
А>/** А>@param [in] src — контейнер с большим количеством элементов уникальных по имени (name) А>@param [in] dest — контейнер с большим количеством элементов уникальных по имени (name) А>@param [out] added — элементы, которых нет в src, но есть в dest (сравнение по имени) А>@param [out] updated — элементы, которые есть в src и в dest, но значения value отличаются А>@param [out] removed — элементы, которые есть в src, но нет в dest (сравнение по имени) А>*/ А>void merge( const Entries& src, const Entries& dest, Entries& added, Entries& updated, Entries& removed ) А>{ А>}
А>У кого есть какие варианты?
Здравствуйте, MasterZiv, Вы писали:
MZ>срывается в последовательный перебор, то получается O(N).
Было бы интересно посмотреть на последовательность строк которая может сорваться в последовательный перебор
Ещё интересны твои комментарии по воводу бинарного берева балансируемого random функцией.
Так-же — не зря ли мы делали локализационные системы и классы SpatialLocator на основе хеша?
Ну и на последок — не идиоты ли сидят в микрософте, которые в своих контейнерах основной упор сделали на хеши?
Здравствуйте, NikeByNike, Вы писали:
NBN>Здравствуйте, MasterZiv, Вы писали:
MZ>>срывается в последовательный перебор, то получается O(N). NBN>Было бы интересно посмотреть на последовательность строк которая может сорваться в последовательный перебор
Здравствуйте, Сергей Мухин, Вы писали:
MZ>>>срывается в последовательный перебор, то получается O(N). NBN>>Было бы интересно посмотреть на последовательность строк которая может сорваться в последовательный перебор
СМ>все значения одинаковые.
Противоречит условиям задачи и алгоритму использования. В изначально описываемом решении я это предусмотрел.
Здравствуйте, NikeByNike, Вы писали:
MZ>>>>срывается в последовательный перебор, то получается O(N). NBN>>>Было бы интересно посмотреть на последовательность строк которая может сорваться в последовательный перебор
СМ>>все значения одинаковые.
NBN>Противоречит условиям задачи и алгоритму использования. В изначально описываемом решении я это предусмотрел.
что всю ветку читать? я ответил на вопрос когда хеш имеет o(n)
Здравствуйте, Сергей Мухин, Вы писали:
СМ>что всю ветку читать? я ответил на вопрос когда хеш имеет o(n)
Такой ответ я продумал ещё когда вопрос писал
СМ>а иначе давай ф-ию, тогда и подберём
Не, так не интересно. Подбери мне последовательность для чёрного ящика, про который известно только то что он выдаёт практически рандомное значение на основе ключа в диапазоне от 0 до 2^32-1.
Ибо по хорошему ничего не мешает мне сделать хеш с несколькими хешфункциями
Здравствуйте, NikeByNike, Вы писали:
NBN>Здравствуйте, Сергей Мухин, Вы писали:
СМ>>что всю ветку читать? я ответил на вопрос когда хеш имеет o(n) NBN>Такой ответ я продумал ещё когда вопрос писал
молодец!
СМ>>а иначе давай ф-ию, тогда и подберём NBN>Не, так не интересно. Подбери мне последовательность для чёрного ящика, про который известно только то что он выдаёт практически рандомное значение на основе ключа в диапазоне от 0 до 2^32-1. NBN>Ибо по хорошему ничего не мешает мне сделать хеш с несколькими хешфункциями
NikeByNike пишет:
> MZ>срывается в последовательный перебор, то получается O(N). > Было бы интересно посмотреть на последовательность строк которая может > сорваться в последовательный перебор
Ну это надо на хэш-функцию глядеть, и подбирать.
> Ещё интересны твои комментарии по воводу бинарного берева балансируемого > random функцией.
> Так-же — не зря ли мы делали локализационные системы и классы > SpatialLocator на основе хеша?
Да не, наверное не зря.
> Ну и на последок — не идиоты ли сидят в микрософте, которые в своих > контейнерах основной упор сделали на хеши?
Нет, не идиоты, они наверняка тесты гоняли, и хэши хитрые изобретали.
Не, я не против хэш-таблиц, просто думаю в рамках этого задания
они неприменимы.
NikeByNike пишет:
> Не, так не интересно. Подбери мне последовательность для чёрного ящика, > про который известно только то что он выдаёт практически рандомное > значение на основе ключа в диапазоне от 0 до 2^32-1.
Практически рандомное он выдавать не может. Это — хэш-функция всё же.
Здравствуйте, Сергей Мухин, Вы писали:
NBN>>Было бы интересно посмотреть на последовательность строк которая может сорваться в последовательный перебор СМ>все значения одинаковые.
С чего бы? Подойдт и перовое...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском