30/09/2018, 17:16

Vector iterator not dereferencable

Em đang thử implement quicksort trên 1 vector struct word (word gồm có string và int) thì sau khi chạy nó bị lỗi Vector iterator not dereferencable, có anh chị nào có thể sửa giúp em được ko ạ em vẫn còn newbie với vector

int partition(vector<word> &database, int start, int end) //partition the vector
{
	word pivot = database[end];
	int pIndex = start;
	for (int i = pIndex; i < end; i++)
	{
		if (database[i].freq > pivot.freq)
		{
			iter_swap(database.begin() + pIndex, database.begin() + i);
			pIndex++;
		}
	}
	iter_swap(database.begin() + pIndex, database.end());
	return pIndex;
}
void quickSort(vector<word> &database, int start, int end)
{
	if (start < end)
	{
		int partitionIndex = partition(database, start, end);
		quickSort(database, start, partitionIndex - 1);
		quickSort(database, partitionIndex + 1, end);
	}
}
Gió viết 19:30 ngày 30/09/2018

Thuật toán bị sai:

iter_swap(database.begin() + pIndex, database.end());
// phải sửa thành     iter_swap(database.begin() +pIndex, database.begin()+end);
  • Lỗi là do bạn truy cập quá kích thước của vector
  • Chỉ cần thêm 2 dòng vào đầu hàm partition là trở thành random_quickSort nó sẽ chạy nhanh hơn trong trường hợp dãy đã dc sắp xếp.
    int pivotIndex=start+rand()%(end-start+1);
    iter_swap(database.begin()+pivotIndex,database.begin()+end);
Ha Gia Phat viết 19:28 ngày 30/09/2018

em cảm ơn anh gió

Ha Gia Phat viết 19:25 ngày 30/09/2018

cơ mà anh giải thích cho em tại sao chọn pivot như vậy nó nhanh hơn ko ạ, em xem trên mạng là ngta bảo hay chọn ở cuối

Gió viết 19:17 ngày 30/09/2018


p/s: ->

cơ mà anh giải thích cho em tại sao chọn pivot như vậy nó nhanh hơn ko ạ, em xem trên mạng là ngta bảo hay chọn ở cuối

  • Cái này thì phải nghiên cứu xác suất mới dc. Nói chung khi dãy đã dc sắp xếp thì cách chọn pivot ở đầu và cuối sẽ bị lệch về 1 bên nên thời gian chạy là O(n2). Còn random là O(nlogn)
Ha Gia Phat viết 19:30 ngày 30/09/2018

anh @gio cho em hỏi thêm 1 cái nữa em test cái thuật toán trên 1 vector 100 phần tử thì ok rồi mà em làm trên quy mô lớn hơn là 10 file texts, mỗi file text có khoảng hơn 400 từ thì nó bị báo lỗi stackoverflow, có phải là do biến cục bộ nhiều quá không ạ

Gió viết 19:29 ngày 30/09/2018

Mỗi từ bao nhiêu kí tự?. Nếu khoảng 100 kí tự * 10 * 400 = 400000 byte thì ko overflow dc
Dùng vector thì nó tự động tăng kích thước khi cần nên biến cục bộ cũng k sao

Ha Gia Phat viết 19:24 ngày 30/09/2018

dạ dữ liệu là tiếng anh nên 1 từ ko quá 20 kí tự

Ha Gia Phat viết 19:28 ngày 30/09/2018

anh @Gio cho em hỏi thêm tí nha em test cái quicksort với 170 file text thì ok (chạy hơi lâu), mỗi file text cỡ 500 từ, mà em sort cỡ 180 file thì nó bị crash lúc đang chạy, debug thì nó bảo stackoverflow, có phải do biến cục bộ nhiều quá không ahnh? em có nên chuyển qua dùng mergesort ko

Gió viết 19:19 ngày 30/09/2018

Dùng merge sort cần thêm bộ nhớ phụ nên càng dễ overflow. Vì bài trên chỉ cần sắp theo freq nên class chỉ lưu freq và chỉ số của chuỗi o trong mảng khác để sắp. Tránh copy chuỗi nhiều lần trong swap

Ha Gia Phat viết 19:29 ngày 30/09/2018

à em hiểu ý anh rồi, cảm ơn anh

Bài liên quan
0