Как решить эту проблему с помощью STL? - PullRequest
0 голосов
/ 17 марта 2011

У меня есть эта проблема: в супружеском браке 5 человек, чтобы получить лучший выбор, каждому из которых предлагается ответить на 10 вопросов с несколькими вариантами ответов с 4 вариантами: A, B, C, D. Теперь лучший матч относится к человеку, имеющему самый высокий «коэффициент сходства» (sf). Например, если Дик и Лиза получили 6 правильных ответов, и sf = 3 (> 6), то Дик и Лиза - хорошие потенциальные партнеры, аналогично мы должны найти других партнеров, так как ответы могут быть 5, 4 или, по крайней мере, 3 такими же исправить как Лиза, так как sf = 3.

members is a string array having list of all members, first field is name, next is sex,     
next are answers to multiple choice questions:

 For this, i have a string array called "members"
 members[ ] = {"Dick, M, A, B, C, A, B...(10 answers)",
          "Lisa, F, A, D, C, B, B...(10 answers)",
          "Harry,M, A, B, A, D, C...(10 answers)",
          "Mira",F, A, B, C, C, A...(10 answers)"
          .
          .
          <snip>
         };

Первое поле в строке - это имя, во втором - пол, M или F, в остальных - 10 ответов на вопросы с несколькими вариантами ответов.

Теперь, используя STL, какой самый быстрый способ найти фактор сходства (те же ответы в вопросах с несколькими вариантами ответов)?

Я знаю о строковом токенизации и добавлении этих отдельных полей в вектор STL. Но как найти фактор сходства? Я знаю общепринятые способы (обходя один за другим и проверяя), но есть ли быстрый способ сравнения с использованием STL?

Фрагмент кода окажет огромную помощь. Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 17 марта 2011

Я не знаю, хотите ли вы этого, но если вы получите все ответы в valarray<std::string>, вы можете сравнить их напрямую.Результатом является valarray<bool>, который содержит true, если соответствующие элементы были равны, и false в противном случае.Затем вы можете посчитать, как часто они были равны, используя:

std::valarray<bool> = (answers1 == answers2);
int count = std::count(&comp_array[0], &comp_array[0]+comp_array.size(), true);
0 голосов
/ 17 марта 2011

может быть, вы могли бы попытаться создать стандартный ответ из ответов на вопросы.Тогда у вас будет доступ к таким методам, как set_difference, set_intersection.Моей первой идеей было бы преобразовать строковый массив ваших членов в нечто более удобное для обработки.

http://www.sgi.com/tech/stl/set.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...