cuốn sách gpt4 ai đã làm

Có thể lấy mẫu ngân hàng bộ nhớ không đổi, O(k)?

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-03 05:14:31 28 4
mua khóa gpt4 Nike

Tôi có luồng đầu vào có kích thước n và tôi muốn tạo luồng đầu ra có kích thước k chứa các phần tử ngẫu nhiên khác nhau của luồng đầu vào mà không cung cấp bất kỳ bộ nhớ bổ sung nào cho các phần tử mẫu đã chọn.

Thuật toán tôi dự định sử dụng về cơ bản như sau:

cho từng phần tử trong luồng đầu vào
nếu ngẫu nhiên()
giảm k
phần tử đầu ra
nếu k = 0
dừng lại
end if
end if
giảm n
kết thúc cho

Hàm ngẫu nhiên() tạo ra một số từ phân phối ngẫu nhiên [0..1). Tôi tin rằng nguyên tắc hoạt động của thuật toán rất đơn giản.

Mặc dù thuật toán có thể kết thúc sớm khi phần tử cuối cùng được chọn nhưng nhìn chung thuật toán vẫn xấp xỉ O(n). Lúc đầu, nó có vẻ hoạt động như mong đợi (xuất ra các phần tử được phân bổ gần như đồng đều nhưng vẫn ngẫu nhiên từ luồng đầu vào), nhưng tôi nghĩ rằng khi k nhỏ hơn nhiều so với n thì có thể có xu hướng chọn các phần tử sau này không đồng đều. Tuy nhiên, tôi không chắc chắn về điều này...vì vậy tôi muốn xác định bằng cách này hay cách khác. Tôi cũng muốn biết liệu thuật toán nhanh hơn có tồn tại hay không. Rõ ràng, vì phải tạo ra k phần tử nên thuật toán không thể nhanh hơn O(k). Đối với giải pháp O(k), người ta có thể giả sử rằng có một hàm Skip(x) có thể bỏ qua x phần tử trong luồng đầu vào (nhưng không quay ngược) trong thời gian O(1). Tuy nhiên, tôi vẫn muốn giữ nguyên yêu cầu không yêu cầu thêm bộ nhớ.

câu trả lời hay nhất

Nếu đó là một luồng thực sự, nó cầnTRÊN)Đã đến lúc quét nó.

Thuật toán hiện tại của bạn vẫn ổn. (Trước đây tôi đã sai.) Bạn có thể chứng minh bằng quy nạp rằng bạn không có lựa chọn nào khác Tôi Xác suất của phần tử đầu tiên trong . thử là 1 - i/n = (ni)/n .Trước hết cho tôi=0 là đúng qua kiểm tra. Bây giờ, nếu bạn chưa có Tôi Xác suất để chọn được nó ở lần thử thứ 1 là 1/(ni) .Rồi vào i+1 Tỷ lệ chọn nó trong lần thử đầu tiên là ((ni)/n) * (1/(ni)) = 1/n .Điều này có nghĩa là trong lần đầu tiên i+1 Xác suất để không chọn nó là1 - i/n - 1/n = 1 - (i+i)/n .Điều này hoàn thành việc quy nạp. Vì vậy trong lần đầu tiên k Xác suất chọn được phần tử đầu tiên trong tris là xác suất không chọn được phần tử đó, hoặc 1 - (n - k/n) = k/n .

nhưng nếu bạn có O(1) phải làm gì? Truy cập bất kỳ phần tử nào? Xin lưu ý rằng việc chọn kLấy cũng giống như việc lựa chọnnkrời khỏi. Do đó, không mất tính tổng quát, ta có thể giả sử k <= n/2 .Điều này có nghĩa là chúng ta có thể sử dụng thuật toán ngẫu nhiên như thế này:

đã chọn = set()
count_chosen = 0
trong khi count_chosen < k:
lựa chọn = Random_element(stream)
nếu lựa chọn không được chọn:
đã chọn.add(lựa chọn)
count_chosen = count_chosen + 1

Bộ sưu tập sẽ Được rồi)khoảng trống, vì mỗi lựa chọn ngẫu nhiên đều mới đối với bạn với xác suất ít nhất là 0,5 , thời gian chạy dự kiến ​​không dài hơn2kSự lựa chọn kém.

Về thuật toán - lấy mẫu ngân hàng bộ nhớ không đổi, O(k) có thể không? , chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/50065008/

28 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress