Clrs представил псевдокод для поиска интервала, который должен найти интервал, который перекрывает интервал i в дереве T. Но я обнаружил, что с некоторыми из моих собственных модификаций он может работать быстрее с постоянным коэффициентом.
Псевдокод clrs выглядит как
INTERVAL-SEARCH(T, i)
x = T.root
while x != T.nil and i does not overlap x.int
if x.left != T.nil and x.left.max ≥ i.low
x = x.left
else x = x.right
return x
Однако я понимаю, что если вы измените его на
INTERVAL-SEARCH(T, i)
x = T.root
while x != T.nil and i does not overlap x.int
if x.left != T.nil and x.left.max ≥ i.low
x = x.left
else if i.high > x.int.low and x.right.max ≥ i.low
x = x.right
else x = T.nil
return x
С тех пор, как код идет вправо, его когда левыйбольше не имеет значения, потому что это либо T.nil, либо x.left.max x.high i.high.
Если это первое, имеет смысл идти вправо, поскольку правая сторона все еще имеет возможность найти интервал с x.high ≥ i.low, но если это последнее, то ни один интервал справа не изменитсятот факт, что x.low> i.high.Аналогично, если x.right.max Я понимаю, что это не меняет асимптотическое время выполнения, но мне было любопытно, потому что я не понимаю, почему в книге просто не указан самый оптимальный псевдокод, так как он кажется более оптимальным в этом смысле.И если код переходит к x.right очень рано, он потенциально может работать намного быстрее.