Главная страница


ru.algorithms

 
 - RU.ALGORITHMS ----------------------------------------------------------------
 From : Mike Murov                           2:5030/976.55  29 Mar 2002  01:18:10
 To : Alexander Shmidt
 Subject : Сравнить матрицы
 -------------------------------------------------------------------------------- 
 
 
 Сpд Маp 27 2002 15:33, я пишу:
  >> <  Е  ><  Е  ><   Хау, бледнолицый  All!   ><  Е  ><  Е  ><
  AS>     (будешь долго за компом сидеть, не то что бледным - зеленым
  AS> станешь!)
 
  AS> Задача есть 25*80 булевых матриц размера 14х8. Каждую из них надо
  AS> сравнить на совпадение с одной из 200 эталонных матриц (такого же
  AS> размера) _как_можно_быстрее_.
 
  AS> Пока делаю так:
 
  AS> При инициализации проги завожу 2х 14*8 масивов множеств. Таким
  AS> образом, на каждый элемент матрицы - по два множества. В одном
  AS> хранятся индексы эталонов, в которых элемент=true, в другом -
  AS> наоборот. При проверке очередной матрицы проходимся по каждому ее
  AS> элементу и ищем пересечение соответствующих множеств (эл. матрицы=true
  AS> - берем множество индексов, где этот элемент=true, =false - берем
  AS> множество индексов, где элемент=falsе). В конце прохода имеем в
  AS> результирующем множетсве либо индекс эталона, которому соответствует
  AS> проверяемая матрица, либо ничего (тоже результат).
 
  AS> Как сделать еще быстрее? Каждая мелочь поможет, каждый такт - на вес
  AS> золота.
 
  AS> Может проверять множества не подряд, а в определенном порядке (чтоб
  AS> быстрее закончить проверку: если на каком-то этапе уже есть множество,
  AS> содержащее <=1 элемент, вываливаемся из процедуры)? Сначала проверять
  AS> какие-то определенные "контрольные" множества, потом - менее
  AS> определяющие?
 
 Булево это 0/1?
 Тогда предлагаю матрицы по 14*8 бит ~128 = 16 байт
   Проверка - memcmp(x, y, 16) - в x86 оптимизировано, прерывается по первому
 несовпадению в байте (или двойном слове, зависит от выравнивания).
   При выравнивании на двойное слово самое худшее (без учета кэша) 4
 такта/сравнение матрицы.
   А теперь самое интересное: при таком подходе сортируем исходный массив из 200 
 образцов как char[16], а дальше можно бинарным поиском т.к. memcmp() выдает 0,
 1, -1...
   Худшее кол-во просмотров log2 200 ~ 8, число тактов 4*8+ 8= 40 тактов для
 проверки бинарного массива 14*8 по 200 образцам, кто меньше?
 
 P.S. Hа C и asm все вот так прозрачно, но если ясна идея то с реализацией
 проблем не будет.
 
 P.P.S. Реально все будет еще быстрее, особенно когда все 200 образцов
 разместятся в кэше (3 200 байт), а последовательные операции сравнения будут
 распараллелены по конвейерам процессора. Причем выравнивание на 16 байт - то что
 доктор прописал для архитектуры P6...
 
 Еще увидимся, Alexander.
 
 --- GoldED/W32 3.0.1
  * Origin: Kill. Ем All. (2:5030/976.55)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Сравнить матрицы   Alexander Shmidt   27 Mar 2002 16:33:54 
 Сравнить матрицы   Max Alekseyev   27 Mar 2002 17:11:06 
 Re: Сравнить матрицы   Sergey Politov   28 Mar 2002 07:02:47 
 Сравнить матрицы   Mike Murov   29 Mar 2002 01:18:10 
 Сравнить матрицы   Elvira Svirshchova   28 Apr 2002 08:42:00 
 Re: Сравнить матрицы   Nick Kovaliov   30 Apr 2002 10:59:56 
 Re: Сравнить матрицы   Andrey Belyakov   02 May 2002 03:00:07 
 Сpавнить матpицы   Alexander V. Lushnikov   01 May 2002 15:25:14 
Архивное /ru.algorithms/40383ca3b7a2.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional