Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 25.02.2016, 15:28
JustProSkill JustProSkill вне форума
Прохожий
 
Регистрация: 21.02.2016
Сообщения: 17
Версия Delphi: Delphi XE5
Репутация: 10
По умолчанию Сортировка карт по убыванию достоинства карт

Обнаружил у себя в коде, что на сортировку строки карт уходит в 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  
Старый 25.02.2016, 16:50
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Можно сортировку возложить на TStringList (свойство Sorted = true), а заполнять его по отдельным картам: 'Ah', 'Kh'...
Ответить с цитированием
  #3  
Старый 25.02.2016, 16:50
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Таблицу соответствия надо бы увидеть. Номинал карт меняется в зависимости от карточной игры. У вас тут A-Туз он старше короля, а вот какие буквы обозначают какую масть я не вижу.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #4  
Старый 25.02.2016, 16:53
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Нельзя для букв использовать сортировку, в картах не алфавитная последовательность, а ведь еще есть цифры от 2 до 10 и их как текст тоже нельзя сортировать.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #5  
Старый 25.02.2016, 18:52
JustProSkill JustProSkill вне форума
Прохожий
 
Регистрация: 21.02.2016
Сообщения: 17
Версия Delphi: Delphi XE5
Репутация: 10
По умолчанию

порядок карт
AKQJT98765432 Итого 13
и масти c,h,d,s
Ответить с цитированием
  #6  
Старый 25.02.2016, 19:35
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

у TStraingList'a имеется TStringList.CustomSort Method, сортировать можно все, что засунется в TStringList и как пожелается
__________________
Понять, что хочет заказчик - бесценно, ведь он платит MasterCard
Ответить с цитированием
  #7  
Старый 25.02.2016, 20:46
JustProSkill JustProSkill вне форума
Прохожий
 
Регистрация: 21.02.2016
Сообщения: 17
Версия Delphi: Delphi XE5
Репутация: 10
По умолчанию

Сделал через CustomSort сортировку StringList с номиналами карт через индексоф LC , но как быть с мастями?
Разве можно сделать так, чтобы при сортировке листа с номиналами аналогичные действие происходили во втором листе?

На ум приходит сделать LC не из 13 карт, а из всех возможных со всеми мастями (52 карты). и И дальше разбить по строкам.

Последний раз редактировалось JustProSkill, 25.02.2016 в 20:53.
Ответить с цитированием
  #8  
Старый 25.02.2016, 21:14
JustProSkill JustProSkill вне форума
Прохожий
 
Регистрация: 21.02.2016
Сообщения: 17
Версия Delphi: Delphi XE5
Репутация: 10
По умолчанию

Хотите прикол?
В коде определения комбинации я использовал функцию, которая возвращает достоинство карты, простым сравнением, если карта = А, то возвращаем 12 и т.д.
Сейчас решил заменить её на ИндексОФ, которая по сути делает тоже самое, в итоге время работы кода увеличилось с 21сек до 30......
Сейчас гляну как сортировка CustomSort влияет на работу.
Ответить с цитированием
  #9  
Старый 25.02.2016, 21:43
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Бывает. Я тоже не так давно задался вопросом замены текста в строке. Тоже оказалось, что родная функция делает это несколько "медленее", раз так в 100.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #10  
Старый 25.02.2016, 22:03
JustProSkill JustProSkill вне форума
Прохожий
 
Регистрация: 21.02.2016
Сообщения: 17
Версия Delphi: Delphi XE5
Репутация: 10
По умолчанию

сортировка через CustomSort(через индексоф) оказалась ещё хуже, подождал минуту и снял процесс.
Ответить с цитированием
  #11  
Старый 25.02.2016, 22:19
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

для чего в CustomSort использовать IndexOf? (если не изменяет память IndexOf рекомендуется использовать на УЖЕ отсортированном списке)
в функцию типа TStringListSortCompare передается два индекса и список, задача функции сравнить всего два элемента (их индексы и где они содержатся имеются в функции) и выдать результат их сравнения
__________________
Понять, что хочет заказчик - бесценно, ведь он платит MasterCard
Ответить с цитированием
  #12  
Старый 25.02.2016, 22:42
JustProSkill JustProSkill вне форума
Прохожий
 
Регистрация: 21.02.2016
Сообщения: 17
Версия Delphi: Delphi XE5
Репутация: 10
По умолчанию

Цитата:
Сообщение от cotseec
для чего в CustomSort использовать IndexOf? (если не изменяет память IndexOf рекомендуется использовать на УЖЕ отсортированном списке)
в функцию типа TStringListSortCompare передается два индекса и список, задача функции сравнить всего два элемента (их индексы и где они содержатся имеются в функции) и выдать результат их сравнения
Я знаю как работает эта функция.
Сейчас сделал так:
записываю исходную строку в СтрингЛист, сортирую
Код:
   if(Get_Weight_Hand(List[Index1][1])<Get_Weight_Hand(List[Index2][1]))then
     Result:=1;
Get_Weight_Hand возвращает силу руки(число) простым if()then
время работы без по моему алгоритму 22 сек, через сорт стринглист 118
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:08.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter