Как найти возможные индексы 3-го наименьшего элемента в максимальной куче от 1 до n различных элементов?
Я знаю, что самый маленький элемент будет где-нибудь на листе.
второе наименьшее будет где-нибудь от n / 2 до n для n больше 3
Но я не знаю, чтобы рассчитывать на 3-й самый маленький. Какие-либо предложения?
Третий наименьший элемент имеет не более двух потомков, что означает, что его дочерний элемент (ren) — это листья, или это лист. (Чтобы доказать это, вы также должны доказать, что элемент, имеющий только одного ребенка, не может иметь не-лист в качестве ребенка. Легко, но утомительно.)
Листья, как вы почти заметили, имеют индексы в диапазоне [floor(n/2)+1, n]
, Если n/2
является целым числом, то этот элемент имеет ровно один дочерний элемент (который является листом), поэтому добавление, которое дает диапазон индексов, которые могут содержать второй по величине элемент.
Элемент, чей первый дочерний элемент находится в диапазоне листьев [floor(n/2)+1,n]
имеет не более двух детей и не имеет детей. Этот диапазон является смежным с диапазоном [ceil (n / 2), n], а объединение двух диапазонов обеспечивает все возможные позиции для третьего по величине элемента.
Первый дочерний элемент в i
имеет индекс 2i
таким образом, первый элемент, чей первый ребенок по крайней мере floor(n/2)+1
является floor(n/4)+1
,
Таким образом, возможные индексы, по которым вы можете найти третий по величине элемент — это диапазон: [floor(n/4)+1,n]
,
Вот другой подход. Взять какой-то элемент по индексу i
, Его непосредственные дети 2i
а также 2i+1
; его внуки 4i, 4i+1, 4i+2, 4i+3
и вообще это потомки на уровне k
являются 2ki, 2ki+1, ..., 2ki + 2ki-1
; В итоге, [2ki, ..., 2k(i+1)-1 ]
, Эти диапазоны, конечно, не перекрываются (действительно, если i
является 1
они даже не смежны). Так что если i
имеет хотя бы одного потомка на уровне k
У него также есть полный набор потомков для всех k' < k
из которых есть 2k-2
,
Из всего этого можно сделать вывод:
Если n ≥ 2ki and n < 2k(i+1)
, затем i
имеет:
2ki-2
потомки на каком-то уровне меньше k
n - 2ki+1
потомки на уровне k
;
Всего: n-1
потомки.
Если n ≥ 2k(i+1) and n < 2k+1i
, затем i
имеет:
2k+1-1
потомки.Грубо говоря, это означает, что последний 2k
элементы не найдены в первом 1/2k
часть базового массива кучи.
Других решений пока нет …