2012-04-13 2 views
0

Это в основном то, что моя программа делает:Выберите 1 из каждого из 11 ArrayLists слишком медленно

, если у вас есть 5 различных рубашек и 4 различных штаны на выбор есть 20 различных комбинаций рубашки и брюки вы может носить, и моя программа будет проходить через все 20 комбинаций, чтобы определить, какой из них «лучший».

Кроме того, в моей ситуации существует 11 различных видов одежды (таких как головные уборы, перчатки, брюки, серьги, обувь, плащ и т. Д.) И целых 10 предметов в каждой категории. Таким образом, может быть целых 11^10 комбинаций, и когда я пытался запустить свою программу всего по 4 в каждой категории или 11^4, это заняло около 5 секунд. 11^10 займут ДНИ.

В настоящее время то, что у меня происходит, равно 11, чтобы петли, вложенные друг в друга, проходили через каждую комбинацию. Это, очевидно, не лучший способ сделать это, потому что он настолько медленный. Как я могу сделать это быстрее? Для контекста у меня есть 1 «внешний» ArrayList, содержащий 11 ArrayLists, и каждый из этих 11 ArrayLists - это список объектов (одежда).

+1

Просто интересно, но что, если вы попытались сделать это с помощью массивов, а не ArrayLists. Но, несмотря на это, вы много зацикливаетесь, поэтому для этого не неожиданно требуется немного времени. –

+4

Как вы определяете, что лучше? – tvanfosson

+0

Кстати, у вас есть ваш экспонат и базы перепутаны. он должен быть 10^11 и 4^11, т. е. с 11 различными категориями с 4 элементами в каждом из общего числа комбинаций 4 * 4 * 4 * 4 * 4 * 4 * 4 * 4 * 4 * 4 * 4 = 4^11, а не 11^4. – tvanfosson

ответ

0

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

0

Редактировать

Поскольку ваша оценка присадки, лучший предмет одежды из каждой категории является тот, который дает лучшую сумму Dex + СИЛЫ + междунар. Это означает, что вам не нужно рассматривать комбинации, просто выберите лучшую рубашку, затем лучшие брюки и т. Д. Итак, 11 петель, а не 11 вложенных петель.

Старый ответ

В общем случае, перебор (то, что вы делаете прямо сейчас) это единственный способ гарантировать правильный ответ.

При некоторых условиях, однако, вы можете сделать лучше: например, если я знаю, что если одна комбинация рубашек-штанов «лучше», чем другая комбинация рубашек, независимо от того, какие другие предметы одежды я выбираю, я могу сначала найдите лучшую комбинацию рубашек-штанов, а затем подумайте, какой предмет одежды лучше всего добавить к ней. Это по сути жадный поиск.

+0

Хм, это на самом деле мог работать. Но теперь, когда вы это придумаете, я думаю, я должен быть немного более конкретным относительно точного алгоритма, потому что вижу потенциальную проблему. Игра смягчит статистику за определенную сумму. Так, например, после того, как у вас будет всего 50 очков от вашей брони, каждая дополнительная str от брони фактически дает только 0.5 str. А также, после того как вы достигнете смягченной str из 65 (или без разрешения 80 из-за множителя 0,5), вы не сможете получить дополнительную броню из вашей брони. Я с трудом думаю о том, как я могу работать в этом методе. – JYeh

+0

На самом деле, просто шучу, я думаю, что понял. Я просто должен следить за итогами каждого стата, и если он будет выше этого числа, будущие предметы одежды не будут вносить свой вклад в этот определенный стат, но другие статистические данные будут по-прежнему идти к общей сумме. Эта математика будет работать так же, как и у меня раньше ... Надеюсь. – JYeh

+0

На самом деле, я не думаю, что в этом случае все так просто ... предположим, что у вас есть только рубашки и штаны, у вас есть одна рубашка + 50str, одна рубашка + 20str, +20dex и только одна пара штанов, которая + 30str, + 30dex. Если вы сначала подберете рубашку, вы подберете неправильный. – trutheality

Смежные вопросы