Sau khi chèn 100000000 phần tử vào heap của tôi và danh sách chưa được phân loại, có vẻ như việc chèn vùng heap thực sự nhanh hơn (12 giây so với 20 giây). Tại sao điều này? Tôi tin rằng chèn đống là O(logn)
trong khi chèn danh sách chưa được phân loại là O(1)
. Tôi cũng nhận thấy rằng việc triển khai chèn heap của tôi không thực sự mở rộng với số lượng đầu vào. Điều này cũng làm tôi bối rối.tại sao việc chèn này vào heap nhanh hơn chèn vào danh sách chưa được sắp xếp?
Dưới đây là đoạn code mà tôi chạy:
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;
}
này là việc thực hiện đống chèn (sử dụng 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;
}
}
Đây là danh sách thực hiện không được phân loại của chèn (sử dụng std::list
) :
//pushes element to the back of a std::list
template <class T>
void UnsortedPQ<T>::insertItem(T data) { dataList.push_back(data); }
Vectơ sử dụng một khối bộ nhớ liền kề duy nhất. Phần cứng hiện đại thực sự rất, rất tốt khi truy cập và quét qua một đoạn RAM liên tiếp. –
Bạn có đang chạy điều này trên thứ gì đó có thể song song/có nhiều lõi không? Nếu đó là trường hợp thì có thể mức hệ điều hành đang tối ưu hóa nó bằng cách xem mọi thứ dưới dạng một khối bộ nhớ liền nhau. – OmegaNalphA
@OmegaNalphA Có, máy của tôi có nhiều lõi. Nhưng bất kể, việc chèn heap sẽ mất nhiều thời gian hơn vì số lượng các phần tử lớn hơn nhưng điều này dường như không xảy ra. – everett