Я пытаюсь создать код, который запускается в определенное время.Мой первый метод должен работать в худшем случае в O (log k).Это мой метод:
public void count(T x) {
if(heap.size() < k){
heap.add(x);
}
else if(heap.size() == k && x.compareTo((T) heap.peek()) > 0){
heap.remove();
heap.add(x);
}
}
У меня проблемы с вычислением времени выполнения.Вызов heap.size (), я уверен, это постоянное время.В то время как метод add () выполняется за O (log k).Это верно и для метода remove ().Другое сравнение также должно занимать только постоянное время.Следовательно, я почти уверен, что моя программа работает в O (log k).Кто-нибудь может подтвердить?
Мой другой метод должен выполняться за O (k log k).Это мой метод:
public List<T> kbest() {
//empty queue first and then restore
List<T> list = new ArrayList<T>();
int size = heap.size();
for(int i = 0; i < size; i++){
list.add(0, heap.poll());
}
for(int j = 0; j < list.size(); j++){
heap.add(list.get(j));
}
return list;
}
Этот способ более сложен для понимания.add () в списке выполняется в постоянное время.Пока add () в куче работает в O (log k).Получение размера кучи является постоянным, как и размер списка (что делается "j" раз).Делает ли это мое время выполнения O (n) как в линейном?