Blog. Just Blog

Быстрый поиск

Введите фрагмент названия статьи для поиска

Сортировка Шелла на Ассемблере

06.10.2022 | Категория: Образ мышления: Assembler | Автор: ManHunter

Сортировка Шелла на Ассемблере

Сегодня разберем еще один алгоритм сортировки - сортировку Шелла. Он назван в честь ученого Дональда Шелла, который в 1959 году опубликовал этот алгоритм. Сортировка Шелла представляет собой нечто среднее между классической пузырьковой сортировкой и сортировкой вставками, легко реализуется на разных языках программирования, при этом показывает хорошую скорость работы и не требует выделения дополнительной памяти.

Читать статью целиком »
Просмотров: 770 | Комментариев: 5

Поиск подстроки в строке по алгоритму Карпа-Рабина

01.06.2022 | Категория: Образ мышления: Assembler | Автор: ManHunter

Поиск подстроки в строке по алгоритму Карпа-Рабина

Когда речь заходит об алгоритмах точного поиска подстроки в строке, то обычно все так или иначе сводится к последовательному сравнению символов. Но есть группа алгоритмов, которые основаны не на сравнении символов, а на сравнении числовых данных - хешей. Одним из таких алгоритмов является алгоритм Карпа-Рабина. Его принцип достаточно простой: вычисляется хеш от строки поиска, затем вычисляется хеш от фрагмента строки, в которой производится поиск. Длина фрагмента равна длине искомой строки. Если хеши равны, то выполняется дополнительное посимвольное сравнение, если не равны, то продвигаемся по строке дальше. Казалось бы, что выигрыша тут никакого быть не может, ведь вместо сравнения вычислительные ресурсы тратятся на хеширование. Однако, как показывает практика, для поиска совпадения это гораздо эффективнее, чем сравнение отдельных символов строк. Вместо O(n*m) операций можно добиться среднего результата O(n+m), где n - длина исходной строки, а m - длина искомой строки. К тому же алгоритм Карпа-Рабина не требует выделения дополнительной памяти для своей работы.

Читать статью целиком »
Просмотров: 1962 | Комментариев: 3

Алгоритм быстрой сортировки на Ассемблере

19.05.2022 | Категория: Образ мышления: Assembler | Автор: ManHunter

Алгоритм быстрой сортировки на Ассемблере

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

Читать статью целиком »
Просмотров: 1503 | Комментариев: 1

Подгонка размеров поля EDIT под используемый шрифт

07.12.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Много чего уже делали и с полями ввода, и со шрифтами. На очереди автоматическая подгонка высоты однострочного элемента EDIT в зависимости от размеров шрифта, который ему назначен. Это необходимо, чтобы при изменении шрифта текст в поле ввода смотрелся правильно. Высота EDIT считается по высоте выбранного шрифта плюс отступ толщиной в двойную рамку, чтобы текст при отображении эту рамку не перекрывал. В случае многострочных полей ввода высоту надо считать по высоте шрифта, умноженной на необходимое количество строк, плюс отступ.
  1. ;-------------------------------------------------------------
  2. ; Подгонка размера поля EDIT под заданный шрифт
  3. ;-------------------------------------------------------------
  4. ; Параметры:
  5. ;   hEdit - хэндл поля EDIT
  6. ;   hFont - хэндл шрифта
  7. ;-------------------------------------------------------------
  8. proc resize_edit hEdit:DWORD, hFont:DWORD
  9.         locals
  10.             rc RECT
  11.             tm TEXTMETRIC
  12.         endl
  13.  
  14.         pusha
  15.  
  16.         mov     edi,[hEdit]
  17.  
  18.         ; Получить контекст устройства
  19.         invoke  GetDC,edi
  20.         or      eax,eax
  21.         ; Поля ввода не существует, на выход
  22.         jz      .loc_exit
  23.  
  24.         xchg    eax,esi
  25.  
  26.         ; Выбрать шрифт
  27.         invoke  SelectObject,esi,[hFont]
  28.         or      eax,eax
  29.         jnz     @f
  30.  
  31.         ; Шрифт не загружен, на выход
  32.         invoke  ReleaseDC,edi,esi
  33.         jmp     .loc_exit
  34. @@:
  35.         ; Получить метрику выбранного шрифта
  36.         lea     ebx,[tm]
  37.         invoke  GetTextMetrics,esi,ebx
  38.         invoke  ReleaseDC,edi,esi
  39.  
  40.         ; Высота шрифта
  41.         mov     ebx,[ebx+TEXTMETRIC.tmHeight]
  42.         ; Добавить к высоте размер рамки
  43.         invoke  GetSystemMetrics,SM_CYEDGE
  44.         shl     eax,2
  45.         add     ebx,eax
  46.  
  47.         ; Получить размеры поля EDIT
  48.         lea     esi,[rc]
  49.         invoke  GetWindowRect,edi,esi
  50.         invoke  GetParent,edi
  51.         ; Отмасштабировать координаты окна
  52.         invoke  MapWindowPoints,HWND_DESKTOP,eax,esi,2
  53.  
  54.         ; Установить новые размеры поля EDIT
  55.         mov     eax,[esi+RECT.right]
  56.         sub     eax,[esi+RECT.left]
  57.         invoke  MoveWindow,edi,[esi+RECT.left],[esi+RECT.top],eax,ebx,TRUE
  58.  
  59. .loc_exit:
  60.         popa
  61.         ret
  62. endp
Функция самодостаточная, не требует дополнительных переменных в сегменте данных. На входе два параметра: hEdit - хэндл поля EDIT, у которого надо изменить размер, и hFont - хэндл шрифта, под размер которого в поле ввода вносятся изменения. Вызывать функцию изменения размера надо сразу после назначения шрифта полю EDIT.

Читать статью целиком »
Просмотров: 1133 | Комментариев: 1

Перемешивание массива на JavaScript

20.11.2020 | Категория: Web-мастеру и не только | Автор: ManHunter

Перемешивание массива на JavaScript

Несмотря на особенности сортировки массивов в JavaScript, которые нашли отражение даже в интернет-мемах, без этой самой сортировки не обойтись. Случайное перемешивание массива - тоже своеобразный вариант сортировки. Для его реализации в этих ваших интернетах обычно рекомендуют воспользоваться следующим или каким-то подобным кодом:
  1. var test_array=[1,2,3,4,5,6,7,8,9,10];
  2.  
  3. test_array.sort(
  4.     function() { return (Math.random()-0.5); }
  5. );
  6. // test_array -> перемешанный массив
На первый взгляд функция рабочая, но при тестировании, особенно на больших массивах, результат оставляет желать лучшего. В зависимости от поведения рандомайзера, в массиве могут оставаться целые последовательности неперемешанных элементов.

Читать статью целиком »
Просмотров: 1661 | Комментариев: 1

Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 3 (0.0028 сек.) / Память: 4.5 Mb
Наверх