Хранение данных:
Я бы сказал, что база данных - хорошая идея (звучит как потенциал для довольно большого набора данных). Я не знаю, сколько вопросов вы планируете иметь, но чтобы немного упростить анализ (включая ваши запросы SQL), вы можете сгруппировать ответы на подобные вопросы в отдельных таблицах. И я согласен, что использование числового значения (байт 0-2) будет хорошим способом выбора вместо логического или чего-то еще. Вы вычисляете показатель сходства, поэтому можете начать с цифр.
Сравнение:
Что касается самого сравнения, я бы предложил создать класс SimilarQuestionAnswers, который содержит список байтов, и класс UserAnswers, который содержит список этих SimilarQuestionAnswers. Он настраивает ваши кластеры на метод кластерного анализа, который вы упомянули. Таким образом, вы можете добавить вес к определенным кластерам. (кластер a является важным кластером, поэтому его оценка умножается на 20, тогда как кластер b не так важен, поэтому его оценка умножается только на 10). Это также позволяет применять различные сравнения для каждого кластера, если это необходимо.
Я знаю, что вы сказали, что вопросы не связаны, но вы по крайней мере можете группировать вопросы по их важности. Я думаю, что анализ последовательности все еще будет работать, если ваша матрица сходства будет равна единице, так что это немного упрощает задачу, но остальной математики, связанной с этим, должно быть достаточно.
Сравнение применено:
Здесь вам пригодится база данных. Используйте запросы SQL, чтобы минимизировать набор данных, с которым вы имеете дело. Если вы сравниваете одного человека со всеми остальными, вы можете использовать метод суммы SQL в их ответах, чтобы получить быстрое и грязное сравнение в каждом кластере и получить только тех, кто находится в пределах определенного порога. Это может привести к некоторому дублированию, но это можно легко устранить.
Другая мысль также состоит в том, чтобы иметь таблицу с каждым пользователем и столбец для каждого кластера со сравнением с фальшивым пользователем, который ответил на каждый вопрос верным. Затем вы можете просто запросить в этой таблице диапазон значений текущих пользователей для каждого кластера. Это может быть быстрее, но менее точно.
В любом случае, в конце концов, вам все равно потребуется выполнить сравнение с каждым из пользователей, которых вы получите по этому запросу. Таким образом, чем быстрее вы сможете сделать это сравнение, тем лучше. Попробуйте придерживаться формулы, которая включает только +, -, *, / большинство методов Math. Какие бы () ни добавляли много времени при большом количестве вызовов.
Извините, что это было так долго, большинство вопросов было довольно открытым, и мне пришлось принять некоторые детали. Надеюсь, это поможет.