2015-01-19 2 views
1

Я читал о реализации B-Tree из Робер Sedgewik и нашел этот фрагмент в else части search метода по этой ссылке: http://algs4.cs.princeton.edu/62btrees/BTree.java.htmlB-Tree Реализация

// internal node 
     else { 
      for (int j = 0; j < x.m; j++) { 
       if (j+1 == x.m || less(key, children[j+1].key)) 
        return search(children[j].next, key, ht-1); 
      } 
     } 

Я ударился головой, но не мог понять, почему он непосредственно начинает сравнивать key с j+1-й элемент от children и не j th. Может ли кто-нибудь пролить свет на этот конкретный момент?

ответ

1

Если вы посмотрите на его объявление метода less(), вы заметите, что он использует compareTo.

По сути, то, что он хотел сделать key.compareTo(children[j+1].key)

Но зачем ему использовать j+1 вместо j? Чтобы понять это, посмотрите на первую часть его условного утверждения; он использует j+1 == x.m, что означает, что он хочет проверить, является ли j + 1 пределом. Если j+1 = x.m, он не хочет продолжать увеличивать j, поэтому он возвращается. Однако, если это еще не предел, проверьте сравнение текущего ключа со следующей клавишей в списке (поскольку существует следующий ключ). Если следующий ключ в списке «меньше», чем текущий ключ, выполните поиск текущего ключа.

Короче говоря: Если j+1 не существует, первая половина оператора if поймает его, и он вырвется из цикла for. В противном случае отметьте ключ j+1.

+0

Правильно, я понял. Но при этом, разве он НЕ СРАВНИТЕЛЬНЫЙ ключ с элементом 'j'th вообще? Мне было интересно, что, если 'ключ' самого элемента' j'th больше, чем 'key'? Он не должен даже идти на «j + 1» тогда, верно? –

+0

Я не думаю, что он пытается сравнить с j. Если вы прочитаете остальную часть функции поиска, это оператор if-else, что заставляет меня предположить, что сравнение j выполняется в инструкции if. Часть «else» (часть, которую вы отправили) находится там, чтобы убедиться, что он не получает NPE (если нет следующего значения) – Aify

+0

На самом деле условие 'if' для листовых узлов (' if (ht == 0) ') и' else' для внутренних узлов. Кроме того, обратите внимание, что в этом блоке 'if' он проверяет от' j = 0'. –

Смежные вопросы