내 힙 및 정렬되지 않은 목록에 100000000 개의 요소를 삽입 한 후 힙 삽입이 실제로 더 빠릅니다 (12 초 대 20 초). 왜 이런거야? 정렬되지 않은 목록 삽입은 O(1)
인 반면 힙 삽입은 O(logn)
이라고 생각합니다. 나는 또한 힙 삽입 구현이 실제로 입력의 수에 비례하지 않는다는 것을 알았다. 이것은 또한 나를 혼란스럽게합니다. 여기 왜 정렬되지 않은 목록에 삽입하는 것보다 힙에 삽입하는 것이 빠릅니까?
int main()
{
clock_t unsortedStart;
clock_t heapStart;
double unsortedDuration;
double heapDuration;
int num_pushes = 100000000;
int interval = 10000;
ofstream unsorted ("unsorted.txt");
ofstream heap ("heap.txt");
UnsortedPQ<int> unsortedPQ;
HeapPQ<int> heapPQ;
unsortedStart = clock();
for (int i = 0; i < num_pushes; ++i)
{
if (i % interval == 0) {
unsortedDuration = (clock() - unsortedStart)/(double) CLOCKS_PER_SEC;
unsorted << unsortedDuration << " " << i << endl;
}
unsortedPQ.insertItem(rand() % 100);
}
heapStart = clock();
for (int i = 0; i < num_pushes; ++i)
{
if (i % interval == 0) {
heapDuration = (clock() - heapStart)/(double) CLOCKS_PER_SEC;
heap << heapDuration << " " << i << endl;
}
heapPQ.insertItem(rand() % 100);
}
return 0;
}
(std::vector
사용) :
template <class T>
void HeapPQ<T>::insertItem(T data) {
//insert into back of heap (std::vector)
dataArray.push_back(data);
int i = dataArray.size() - 1;
//sifts the inserted element up
while (i != 0 && dataArray[(i - 1)/2] > dataArray[i]) {
swap(dataArray[i], dataArray[(i - 1)/2]);
i = (i - 1)/2;
}
}
이 삽입물의 정렬되지 않은리스트의 구현이 (std::list
사용)입니다 :
//pushes element to the back of a std::list
template <class T>
void UnsortedPQ<T>::insertItem(T data) { dataList.push_back(data); }
벡터는 단일 연속 메모리 블록을 사용합니다. 현대의 하드웨어는 연속적으로 연속적인 RAM을 통해 액세스하고 스캔하는 데있어 매우 뛰어납니다. –
병렬 처리가 가능하거나 여러 개의 코어가있는 항목에서이 작업을 실행하고 있습니까? 그렇다면 OS 레벨은 모든 것을 연속 된 메모리 블록으로보고 최적화 할 수 있습니다. – OmegaNalphA
@OmegaNalphA 예, 내 컴퓨터에 여러 개의 코어가 있습니다. 그러나 관계없이 힙 삽입은 요소 수가 많아지면 길어 지지만 이렇게되지는 않습니다. – everett