Функция сравнения красно-черных деревьев

Я реализовал красно-черное дерево в C. На карте C ++ можно предоставить настраиваемое сравнение, которое выполняет только операцию value1 ‹value2. Эта операция возвращает истину или ложь, но как реализовать дерево без операции сравнения? Я хочу, чтобы моя функция сравнения возвращала только 1 или 0 без оператора ==. Я пытался прочитать его в stl, но код не читается, хотя у меня есть опыт работы с C ++.

Полный код не требуется, потому что это тот же код, что и любая другая реализация дерева. На данный момент существует следующая функция сравнения:

int cmp(void *key1, void *key2){
  if(*(int*)key1 < *(int*)key2){
    return 1;
  }else if(*(int*)key1 > *(int*)key2){
    return -1;
  }else{
    return 0;
  }
}

Мне нужна такая функция сравнения:

int cmp(void *key1, void *key2){
  if(*(int*)key1 < *(int*)key2){
    return 1;
  }else{
    return 0;
  }
}

Я не понимаю, как работает поиск с этой функцией сравнения, потому что при обнаружении узла нет условия остановки.


person Gustavo    schedule 17.02.2016    source источник
comment
Я реализовал красно-черное дерево в C. На карте C ++ ... - Так на каком языке? C и C ++ - это разные языки!   -  person too honest for this site    schedule 18.02.2016
comment
Я намеревался заглянуть в библиотеку C ++ stl, чтобы понять, как она работает.   -  person Gustavo    schedule 18.02.2016
comment
Вы также можете заглянуть в библиотеку Python или Fortran. Но это не показывает, как реализовать это в C. И C очень хорошо имеет операторы сравнения. Чтобы изучить C, читайте книгу C, а не книгу или роман о C ++. Если у вас есть конкретная проблема с кодом C, четко укажите ее и предоставьте минимальный воспроизводимый пример < / а>.   -  person too honest for this site    schedule 18.02.2016


Ответы (1)


Вы можете выразить равенство в терминах строгого неравенства:

(a == b) <==> !(a < b || b < a)

Эквивалентность предполагает, что отношение сравнения является строгим полным порядком. Этого требуют типы сравнения C ++, а также то, что вы должны требовать от функции сравнения в вашей реализации дерева.

Что касается поиска по двоичному дереву, посмотрите, как реализован первый cmp. Обратите внимание, как он определяет, когда нужно вернуть 0, используя только <. Ваша реализация может сделать то же самое, используя второй cmp.

person eerorika    schedule 17.02.2016
comment
Конечно, это предполагает, что оператор < описывает полное упорядочение. Не все типы допускают такой порядок, и не все < операторы его предоставляют. С другой стороны, те, которые этого не делают, вероятно, не должны использоваться в дереве поиска. - person John Bollinger; 18.02.2016
comment
@JohnBollinger действительно, мой ответ предполагает контекст типов сравнения C ++, которые требуют строгого общего порядка. Я скажу об этом прямо. - person eerorika; 18.02.2016
comment
OP, кажется, повторно реализован на C. Не уверен, в чем его проблема, поскольку он даже не показывает код. - person too honest for this site; 18.02.2016
comment
@Olaf, насколько я понимаю, Густаво спрашивает, как реализовать сравнение равенства, когда функция сравнения выполняет только неравенство. - person eerorika; 18.02.2016
comment
См. Его комментарий к другому вопросу. Кажется, он пытается изучить C, используя C ++ в качестве шаблона. - person too honest for this site; 18.02.2016
comment
@Olaf другой комментарий, похоже, в значительной степени подтверждает мою интерпретацию. Хотя почему-то противоречат исходному вопросу, предлагая использовать нестрогое неравенство. - person eerorika; 18.02.2016