Алгоритмическая задача на поиск по составному ключу
Добрый день.
Пока писал проект возник вопрос, который можно решить массой способов и в принципе любой прокатит, поскольку объем данных невелик, но всё же есть ощущение, что мне не хватает знаний по алгоритмам.
Имеем приблизительно задачку такого плана. Есть два пользователя. Один приглашает второго на сеанс связи. Второй получает уведомление об этом, на которое он может ответить в течении скажем 1 минуты. С другой стороны, второй пользователь может сделать встречный вызов и он будет иметь такой же результат, как согласие.
Что имеется тогда.
user1.id, user2.id и временная метка в момент инициации инвайта, назовём time.
Нужно иметь возможность сделать поиск по user1.id И user2.id вне зависимости от порядка этих аргументов. Первое что приходит на ум это нечто вроде ключа, значение которого формируется из user1.id + user2.id, не завися от порядка слагаемых. Если сделать побитовое сложение значений id, то вроде всё круто получится, но есть риск получить коллизию. Проверить актуальность предложения далее уже тривиально, взяв значение из массива по найденному ключу.
Я знаю, что это можно решить через два массива или даже БД, но это не интересно.
Можно сделать символьное сложение идентификаторов с разделителем и перебирать на каждой итерации два варианта для сравнения, но неужели лучше решения нет?
Пока лучшее решение даже для символьных id выглядит так.
Сравниваем id1 и id2 побитово, чтобы вычислить больший и меньший. Соответственно, ключ для массива формируется user1.id + разделитель + user2.id , если user1.id меньше чем user2.id. И аналогично, если наоборот. Тогда поиск будет своидиться к формированию слепка по алгоритму выше и проверке на существование данного ключа в массиве.
@kryoz Вообще-то сортировка - упорядочение списка/массива согласно некой функции сравнения двух элементов так, чтобы предыдущий элемент отсортированного списка всегда был не больше (или не меньше) предыдущего. Для алфавитной сортировки строк как раз и используются функции strcmp/strcasecmp.