Информация об изменениях

Сообщение 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", например.

Вариант который вам предлогал колега чем не понравился? Что-то вида:
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", например.

Вариант который вам предлагал колега чем не понравился? Что-то вида:
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;
}