Tôi đã suy nghĩ về câu hỏi bài tập về nhà này một chút ngay bây giờ. Với một mảng số có kích thước n, thiết kế một thuật toán sẽ tìm thấy các giá trị cao và thấp với hầu hết các so sánh 1.5n.Thuật toán để tìm số cao/thấp với tối đa 1.5n so sánh
thử đầu tiên của tôi là
int high=0
int low= Number.MaxValue //problem statement is unclear on what type of number to use
Number numList[0 . . n] //number array, assuming unsorted
for (i=0, i < n, i++) {
if (numList[i] > high)
high = numList[i]
else if (numList[i] < low)
low = numList[i]
}
Vấn đề của tôi là mỗi lần lặp của vòng lặp có một trong ba khả năng:
- giá trị thấp được tìm thấy - 1 so sánh làm
- giá trị cao được tìm thấy - 2 so sánh được thực hiện
- không tìm thấy - 2 so sánh được thực hiện
Vì vậy, đối với toàn bộ mảng truyền tải, có thể thực hiện tối đa các phép so sánh 2n, đây là một sự khác biệt lớn so với yêu cầu tối đa của vấn đề là 1,5 so sánh.
Trong loại vấn đề này, giá trị bắt đầu tốt nhất là phần tử đầu tiên. – wildplasser
@ wildplasser, bạn có nghĩa là khởi tạo cả cao và thấp với giá trị phần tử đầu tiên? – Jason
Có. Điều đó tránh lựa chọn một giá trị sentinel có thể tùy ý {thấp hơn, cao hơn}. Trường hợp 'mảng trống' luôn luôn đặc biệt (nó * có * không thấp nhất, cao nhất) – wildplasser