Сообщение Re[5]: Оптимизация поиска анаграмм от 04.04.2017 9:53
Изменено 04.04.2017 9:54 kov_serg
Re[5]: Оптимизация поиска анаграмм
Здравствуйте, Artem Korneev, Вы писали:
AK>Здравствуйте, kov_serg, Вы писали:
_>>>>hash=[ bit0=has(a), bit1=has(b), ... bit(25)=has(z), bit(26..31)=length ]
AK>>>Не, ну бита там явно не хватит, нужен учёт количества символов. Бит даст одинаковый хэш для "ab" и "baaab" — слишком много коллизий.
_>>У "ab" length=2, а у "baaab" length=5. Где коллизии?
AK>Я на length в конце внимания не обратил.
AK>Коллизии будут у строк одинаковой длины с одинаковым набором используемых символов, "aaaab" и bbabb", например.
Вариант который вам предлогал колега чем не понравился? Что-то вида:
AK>Здравствуйте, kov_serg, Вы писали:
_>>>>hash=[ bit0=has(a), bit1=has(b), ... bit(25)=has(z), bit(26..31)=length ]
AK>>>Не, ну бита там явно не хватит, нужен учёт количества символов. Бит даст одинаковый хэш для "ab" и "baaab" — слишком много коллизий.
_>>У "ab" length=2, а у "baaab" length=5. Где коллизии?
AK>Я на length в конце внимания не обратил.
AK>Коллизии будут у строк одинаковой длины с одинаковым набором используемых символов, "aaaab" и bbabb", например.
Вариант который вам предлогал колега чем не понравился? Что-то вида:
int code(char c) {
if (c>='a' && c<='z') return c-'a';
if (c>='A' && c<='Z') return c-'A';
return 26;
}
int hash(const char *s) {
enum { N=26 };
static const int p[N+1]={
3259,3271,3299,3301,3307,3313,3319,3323,3329,3331,3343,3347,3359,
3361,3371,3373,3389,3391,3407,3413,3433,3449,3457,3461,3463,3467,
1
};
int h=1; for(;*s;s++) h*=p[code(*s)];
return h;
}
Re[5]: Оптимизация поиска анаграмм
Здравствуйте, Artem Korneev, Вы писали:
AK>Здравствуйте, kov_serg, Вы писали:
_>>>>hash=[ bit0=has(a), bit1=has(b), ... bit(25)=has(z), bit(26..31)=length ]
AK>>>Не, ну бита там явно не хватит, нужен учёт количества символов. Бит даст одинаковый хэш для "ab" и "baaab" — слишком много коллизий.
_>>У "ab" length=2, а у "baaab" length=5. Где коллизии?
AK>Я на length в конце внимания не обратил.
AK>Коллизии будут у строк одинаковой длины с одинаковым набором используемых символов, "aaaab" и bbabb", например.
Вариант который вам предлагал колега чем не понравился? Что-то вида:
AK>Здравствуйте, kov_serg, Вы писали:
_>>>>hash=[ bit0=has(a), bit1=has(b), ... bit(25)=has(z), bit(26..31)=length ]
AK>>>Не, ну бита там явно не хватит, нужен учёт количества символов. Бит даст одинаковый хэш для "ab" и "baaab" — слишком много коллизий.
_>>У "ab" length=2, а у "baaab" length=5. Где коллизии?
AK>Я на length в конце внимания не обратил.
AK>Коллизии будут у строк одинаковой длины с одинаковым набором используемых символов, "aaaab" и bbabb", например.
Вариант который вам предлагал колега чем не понравился? Что-то вида:
int code(char c) {
if (c>='a' && c<='z') return c-'a';
if (c>='A' && c<='Z') return c-'A';
return 26;
}
int hash(const char *s) {
enum { N=26 };
static const int p[N+1]={
3259,3271,3299,3301,3307,3313,3319,3323,3329,3331,3343,3347,3359,
3361,3371,3373,3389,3391,3407,3413,3433,3449,3457,3461,3463,3467,
1
};
int h=1; for(;*s;s++) h*=p[code(*s)];
return h;
}