Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2007.09.09;
Скачать: [xml.tar.bz2];

Вниз

Четкое быстрое сравнение строк без учета регистра символов.   Найти похожие ветки 

 
Черный Шаман   (2007-08-15 17:21) [0]

Есть такая функция CompareStringW, к ней обращается WideCompareString. Но сравнение происходит довольно медленно.

Есть ли функции которые могут проводить сравнение намного быстрее, например с использованием хеш-таблиц символов.

Конечно я ускорил поиск в массиве строк, добавив туда хеш-строки, но все равно один раз происходит вызов CompareStringW и это тормозит, визуально проблемы в скорости незаметны, но если замерять миллисекунды работы алгоритма, то без последнего вызовы CompareStringW если совпадает хеш-функция строк алгоритм работает в 2 раза быстрее.


 
tesseract ©   (2007-08-15 17:39) [1]


>  но если замерять миллисекунды работы алгоритма, то без
> последнего вызовы CompareStringW если совпадает хеш-функция
> строк алгоритм работает в 2 раза быстрее.


Переводи в ANSI перед сравнением - как правило прибавляет скорости.


 
Черный Шаман   (2007-08-15 19:17) [2]

Написал сама нужные функции, может кому-то пригодится
unit uQWideStrings;

interface

uses
 Windows,  SysUtils, Variants, Classes;

var
 WideUpperHash: array [Word] of WideChar;

function QuickWideSameStrIgnoreCase(const S1, S2: WideString): boolean;
function QuickHashIgnoreCase(const S1: WideString): longword;
function QuickWideUpperCase(const S1: WideString): WideString;

implementation

function QuickWideUpperCase(const S1: WideString): WideString;
var
 i, ind: integer;
begin
 if S1 = "" then
   begin
     Result := "";
     Exit;
   end;

 ind := Length(S1);
 SetLength(Result, ind);
 for i:= 1 to ind do
   Result[i] := WideUpperHash[Word(S1[i])];
end;

function QuickWideSameStrIgnoreCase(const S1, S2: WideString): boolean;
var
 i, ind: integer;
begin
 Result := False;
 if Length(S1) <> Length(S2) then Exit;
 //
 Result := True;
 ind := Length(S1);
 //
 for i := 1 to ind do
   if WideUpperHash[Word(S1[i])] <> WideUpperHash[Word(S2[i])] then
     begin
       Result := False;
       Exit;
     end;
end;

function QuickHashIgnoreCase(const S1: WideString): longword;
const
 CRCtable: array[0..255] of DWORD = (
   $00000000, $77073096, $EE0E612C, $990951BA, $076DC419, $706AF48F, $E963A535,
   $9E6495A3, $0EDB8832, $79DCB8A4,
   $E0D5E91E, $97D2D988, $09B64C2B, $7EB17CBD, $E7B82D07, $90BF1D91, $1DB71064,
   $6AB020F2, $F3B97148, $84BE41DE,
   $1ADAD47D, $6DDDE4EB, $F4D4B551, $83D385C7, $136C9856, $646BA8C0, $FD62F97A,
   $8A65C9EC, $14015C4F, $63066CD9,
   $FA0F3D63, $8D080DF5, $3B6E20C8, $4C69105E, $D56041E4, $A2677172, $3C03E4D1,
   $4B04D447, $D20D85FD, $A50AB56B,
   $35B5A8FA, $42B2986C, $DBBBC9D6, $ACBCF940, $32D86CE3, $45DF5C75, $DCD60DCF,
   $ABD13D59, $26D930AC, $51DE003A,
   $C8D75180, $BFD06116, $21B4F4B5, $56B3C423, $CFBA9599, $B8BDA50F, $2802B89E,
   $5F058808, $C60CD9B2, $B10BE924,
   $2F6F7C87, $58684C11, $C1611DAB, $B6662D3D, $76DC4190, $01DB7106, $98D220BC,
   $EFD5102A, $71B18589, $06B6B51F,
   $9FBFE4A5, $E8B8D433, $7807C9A2, $0F00F934, $9609A88E, $E10E9818, $7F6A0DBB,
   $086D3D2D, $91646C97, $E6635C01,
   $6B6B51F4, $1C6C6162, $856530D8, $F262004E, $6C0695ED, $1B01A57B, $8208F4C1,
   $F50FC457, $65B0D9C6, $12B7E950,
   $8BBEB8EA, $FCB9887C, $62DD1DDF, $15DA2D49, $8CD37CF3, $FBD44C65, $4DB26158,
   $3AB551CE, $A3BC0074, $D4BB30E2,
   $4ADFA541, $3DD895D7, $A4D1C46D, $D3D6F4FB, $4369E96A, $346ED9FC, $AD678846,
   $DA60B8D0, $44042D73, $33031DE5,
   $AA0A4C5F, $DD0D7CC9, $5005713C, $270241AA, $BE0B1010, $C90C2086, $5768B525,
   $206F85B3, $B966D409, $CE61E49F,
   $5EDEF90E, $29D9C998, $B0D09822, $C7D7A8B4, $59B33D17, $2EB40D81, $B7BD5C3B,
   $C0BA6CAD, $EDB88320, $9ABFB3B6,
   $03B6E20C, $74B1D29A, $EAD54739, $9DD277AF, $04DB2615, $73DC1683, $E3630B12,
   $94643B84, $0D6D6A3E, $7A6A5AA8,
   $E40ECF0B, $9309FF9D, $0A00AE27, $7D079EB1, $F00F9344, $8708A3D2, $1E01F268,
   $6906C2FE, $F762575D, $806567CB,
   $196C3671, $6E6B06E7, $FED41B76, $89D32BE0, $10DA7A5A, $67DD4ACC, $F9B9DF6F,
   $8EBEEFF9, $17B7BE43, $60B08ED5,
   $D6D6A3E8, $A1D1937E, $38D8C2C4, $4FDFF252, $D1BB67F1, $A6BC5767, $3FB506DD,
   $48B2364B, $D80D2BDA, $AF0A1B4C,
   $36034AF6, $41047A60, $DF60EFC3, $A867DF55, $316E8EEF, $4669BE79, $CB61B38C,
   $BC66831A, $256FD2A0, $5268E236,
   $CC0C7795, $BB0B4703, $220216B9, $5505262F, $C5BA3BBE, $B2BD0B28, $2BB45A92,
   $5CB36A04, $C2D7FFA7, $B5D0CF31,
   $2CD99E8B, $5BDEAE1D, $9B64C2B0, $EC63F226, $756AA39C, $026D930A, $9C0906A9,
   $EB0E363F, $72076785, $05005713,
   $95BF4A82, $E2B87A14, $7BB12BAE, $0CB61B38, $92D28E9B, $E5D5BE0D, $7CDCEFB7,
   $0BDBDF21, $86D3D2D4, $F1D4E242,
   $68DDB3F8, $1FDA836E, $81BE16CD, $F6B9265B, $6FB077E1, $18B74777, $88085AE6,
   $FF0F6A70, $66063BCA, $11010B5C,
   $8F659EFF, $F862AE69, $616BFFD3, $166CCF45, $A00AE278, $D70DD2EE, $4E048354,
   $3903B3C2, $A7672661, $D06016F7,
   $4969474D, $3E6E77DB, $AED16A4A, $D9D65ADC, $40DF0B66, $37D83BF0, $A9BCAE53,
   $DEBB9EC5, $47B2CF7F, $30B5FFE9,
   $BDBDF21C, $CABAC28A, $53B39330, $24B4A3A6, $BAD03605, $CDD70693, $54DE5729,
   $23D967BF, $B3667A2E, $C4614AB8,
   $5D681B02, $2A6F2B94, $B40BBE37, $C30C8EA1, $5A05DF1B, $2D02EF8D);
var
 i: integer;
 ind: integer;
 S2: WideString;
 Data: PByteArray;
begin
 Result := $FFFFFFFF;
 //
 S2 := QuickWideUpperCase(S1);
 //
 ind := (Length(S2) * SizeOf(WideChar)) - 1;
 Data := @S2[1];
 for i := 0 to ind do
   Result := (result shr 8) xor (CRCtable[byte(result) xor Ord(Data[i + 1])]);
 Result := Result xor $FFFFFFFF;
 S2 := "";
end;

var
 HashIterator: integer;
 HashStr: WideString;
initialization
 begin
   SetLength(HashStr, MaxWord + 1);
   //ёяхЁтр тючтюфшь ёЄЁюъє т
   for HashIterator := 1 to MaxWord + 1 do
     HashStr[HashIterator] := WideChar(HashIterator - 1);
   HashStr := WideUpperCase(HashStr);
   for HashIterator := 0 to MaxWord do
     WideUpperHash[HashIterator] := HashStr[HashIterator-1];
   HashStr := "";
 end;
end.



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2007.09.09;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.046 c
15-1186782789
Petr V. Abramov
2007-08-11 01:53
2007.09.09
C. Иванов привазвал наказывать за уклонение от :")


2-1187229718
Alex_AA
2007-08-16 06:01
2007.09.09
Какой компонент лучше использовать для вставки Word-таблицы


15-1186507910
Mr. D
2007-08-07 21:31
2007.09.09
RLE-кодирование


2-1187067945
term77
2007-08-14 09:05
2007.09.09
ADOCommand, Acess


4-1174320505
Serega41
2007-03-19 19:08
2007.09.09
Как узнать открыто ли было устройство?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский