|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Сортировка карт по убыванию достоинства карт
Обнаружил у себя в коде, что на сортировку строки карт уходит в 2 раза больше времени чем на определение комбинации, что очень плохо (я много раз оптимизировал этот алгоритм, и думал он идеален, там 5-6 строчек кода, оказалось нет, и идей больше нет).
Есть строка с картами и мастями: 'AhKhQhJh2hAsKs', её необходимо отсортировать по убыванию достоинства карт и разбить на 2 строки Unsuited и Suited (номинал и масти: т.е. получается AAKKQJ2 и hshshhh). Как делаю я: я у меня есть StringList LC с картами от А до 2(13 строк), я начинаю прогонять по каждой карте начиная от А, пока входная строка (назовём её Hand, а функцию SortHand) не закончится. Допустим берём первый проход с А, далее идёт цикл while(AnsiPos(LC[i],hand)>0) do (пока во входной строке есть текущая карта А, добавляем ей к строке Unsuited, и её масть к Suited, после удаляем из строки карту которую нашли). Как по мне алгоритм идеален и лучше не сделать, но кто знает может у кого то будут идеи лучше. |
#2
|
|||
|
|||
Можно сортировку возложить на TStringList (свойство Sorted = true), а заполнять его по отдельным картам: 'Ah', 'Kh'...
|
#3
|
||||
|
||||
Таблицу соответствия надо бы увидеть. Номинал карт меняется в зависимости от карточной игры. У вас тут A-Туз он старше короля, а вот какие буквы обозначают какую масть я не вижу.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#4
|
||||
|
||||
Нельзя для букв использовать сортировку, в картах не алфавитная последовательность, а ведь еще есть цифры от 2 до 10 и их как текст тоже нельзя сортировать.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#5
|
|||
|
|||
порядок карт
AKQJT98765432 Итого 13 и масти c,h,d,s |
#6
|
||||
|
||||
у TStraingList'a имеется TStringList.CustomSort Method, сортировать можно все, что засунется в TStringList и как пожелается
Понять, что хочет заказчик - бесценно, ведь он платит MasterCard |
#7
|
|||
|
|||
Сделал через CustomSort сортировку StringList с номиналами карт через индексоф LC , но как быть с мастями?
Разве можно сделать так, чтобы при сортировке листа с номиналами аналогичные действие происходили во втором листе? На ум приходит сделать LC не из 13 карт, а из всех возможных со всеми мастями (52 карты). и И дальше разбить по строкам. Последний раз редактировалось JustProSkill, 25.02.2016 в 20:53. |
#8
|
|||
|
|||
Хотите прикол?
В коде определения комбинации я использовал функцию, которая возвращает достоинство карты, простым сравнением, если карта = А, то возвращаем 12 и т.д. Сейчас решил заменить её на ИндексОФ, которая по сути делает тоже самое, в итоге время работы кода увеличилось с 21сек до 30...... Сейчас гляну как сортировка CustomSort влияет на работу. |
#9
|
||||
|
||||
Бывает. Я тоже не так давно задался вопросом замены текста в строке. Тоже оказалось, что родная функция делает это несколько "медленее", раз так в 100.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#10
|
|||
|
|||
сортировка через CustomSort(через индексоф) оказалась ещё хуже, подождал минуту и снял процесс.
|
#11
|
||||
|
||||
для чего в CustomSort использовать IndexOf? (если не изменяет память IndexOf рекомендуется использовать на УЖЕ отсортированном списке)
в функцию типа TStringListSortCompare передается два индекса и список, задача функции сравнить всего два элемента (их индексы и где они содержатся имеются в функции) и выдать результат их сравнения Понять, что хочет заказчик - бесценно, ведь он платит MasterCard |
#12
|
|||
|
|||
Цитата:
Сейчас сделал так: записываю исходную строку в СтрингЛист, сортирую Код:
if(Get_Weight_Hand(List[Index1][1])<Get_Weight_Hand(List[Index2][1]))then Result:=1; время работы без по моему алгоритму 22 сек, через сорт стринглист 118 |