Xác định số cụ thể theo thời gian và không gian


10

Cho rằng là các số nguyên sao cho 0 \ le A [k] \ le m cho tất cả 1 \ le k \ le n và sự xuất hiện của mỗi số ngoại trừ một số cụ thể trong A [1 \ ldotd n] là một số lẻ. Cố gắng tìm số có số lần xuất hiện là số chẵn.0 A [ k ] m 1 k n A [ 1 . . n ]A[1..n]0A[k]m1knA[1..n]

Có một thuật toán Θ(nđăng nhậpn) : chúng tôi sắp xếp Một[1..n] thành B[1..n] và chia B[1..n] thành nhiều phần, có giá trị các phần tử là giống nhau, do đó chúng ta có thể đếm sự xuất hiện của từng yếu tố.

Tôi muốn tìm một thuật toán không gian xấu nhất - Ôi(n) -time-and- Ôi(n) .

Giả sử m= =Ω(n1+ε)ε>0 , do đó, loại radix không được chấp nhận. Các hoạt động theo bit nhị phân có thể chấp nhận được, ví dụ: Một[1]xorMột[2] .


Câu trả lời của Aryabhata dưới đây cho thấy trường hợp chung là không tốt, nhưng có lẽ bạn còn hạn chế hơn nữa? Một hạn chế đơn giản (nhưng lớn) sẽ là bắt buộc tất cả các mục trong mảng có kích thước Ôi(n) . Điều này sẽ cung cấp một thuật toán tuyến tính khá nhỏ.
Luke Mathieson

1
@LukeMathieson: Tôi đã xóa câu trả lời đó, vì tôi chưa tin rằng bài báo mà tôi đã trích dẫn sẽ hoạt động mà không có bất kỳ sửa đổi nào, và bên cạnh đó, OP dường như chỉ quan tâm đến mô hình RAM chi phí thống nhất.
Aryabhata

@Aryabhata: hehe, câu trả lời không có ở đó! Thật thú vị và có lẽ hữu ích cho Frank, bạn nghĩ vấn đề gì với việc điều chỉnh kết quả trong bài báo? Một lướt qua nhanh gợi ý nó được áp dụng, nhưng rõ ràng tôi đã không đọc nó.
Luke Mathieson

@LukeMathieson: Thực tế là các yếu tố khác cần xuất hiện một số lần lẻ trong vấn đề hiện tại. Kể từ đó, tôi cũng đọc lướt qua bằng chứng ...
Aryabhata

Sẽ rất thú vị nếu bạn quan tâm đến kết quả lý thuyết hoặc các giải pháp thực tế. Từ quan điểm lý thuyết, phản ứng nhanh đầu tiên của tôi là, bạn có thể sắp xếp danh sách các số nguyên nhanh hơn . Có một thuật toán xác định bởi Han chạy trong thời gian . Đối với các thuật toán ngẫu nhiên, thậm chí các kết quả tốt hơn đã được biết, ví dụ Han và Thorup đã tìm thấy thuật toán thời gian dự kiến . Tuy nhiên, tôi nghĩ rằng vấn đề của bạn không cần phải phân loại. O(nlogn)O ( n O(loglogn)O(nloglogn)
A.Schulz

Câu trả lời:


2

Đây là một ý tưởng cho một thuật toán đơn giản; Chỉ cần đếm tất cả các lần xuất hiện!

  1. Tìm . - thời gianΘ ( n )m= =tối đaMộtΘ(n)
  2. "Phân bổ" mảng . - Thời gian ¹O ( 1 )C[0 ..m]Ôi(1)
  3. Lặp lại trên và tăng bất cứ khi nào bạn tìm thấy . Nếu là , add vào một danh sách tuyến tính . - thời gianC [ x ] A [ _ ] = x C [ x ] 0 x L Θ ( n )MộtC[x]A[_]=xC[x]0xLΘ(n)
  4. Lặp lại và tìm phần tử với chẵn. - thời gian .LxeC[xe]O(n)
  5. Trả lại .xe

Nói chung, điều này mang đến cho bạn một thuật toán thời gian tuyến tính có thể sử dụng (theo nghĩa phân bổ) rất nhiều bộ nhớ. Lưu ý rằng việc có thể truy cập ngẫu nhiên trong thời gian không đổi độc lập với là rất quan trọng ở đây.Cm

Một bổ sung bị ràng buộc trên không gian khó khăn hơn với phương pháp này; Tôi không biết bất kỳ cấu trúc dữ liệu từ điển nào cung cấp tra cứu thời gian . Bạn có thể sử dụng các bảng băm mà ở đây là các triển khai với thời gian tra cứu dự kiến ( kích thước của bảng, số lượng phần tử được lưu trữ) để bạn có thể tùy ý sử dụng không gian tuyến tính - theo dự kiến. Nếu tất cả các giá trị trong ánh xạ tới cùng một giá trị băm, bạn sẽ bị vặn.O(n)O(1)O(1+k/n) nkMột


  1. Trên RAM, điều này được thực hiện ngầm; tất cả những gì chúng ta cần là vị trí bắt đầu và có thể là vị trí kết thúc.

0

Một giải pháp gần như tầm thường - sử dụng không gian - là sử dụng bản đồ băm. Hãy nhớ lại rằng một bản đồ băm đã khấu hao thời gian chạy để thêm và tìm kiếm các phần tử.O ( 1 )Θ(n)O(1)

Do đó, chúng ta có thể sử dụng thuật toán sau:

  1. Phân bổ một bản đồ băm . Lặp trên . Đối với mỗi phần tử , hãy tăng số lần xuất hiện, nghĩa là .A i A H ( i ) + +HAiAH(i)++

  2. Lặp lại thông qua bộ khóa của bản đồ băm và kiểm tra xem các phím nào có số lần xuất hiện chẵn.

Bây giờ đây là một thuật toán đơn giản không thực sự sử dụng bất kỳ thủ thuật lớn nào, nhưng đôi khi ngay cả điều này cũng đủ. Nếu không, bạn có thể muốn chỉ định những hạn chế về không gian mà bạn áp đặt.


Tôi vẫn muốn biết, nếu có một thuật toán thời gian không ngẫu nhiên sử dụng không gian đa thức. Cụ thể, có bằng chứng lý thuyết nào cho thấy việc tìm kiếm vật phẩm chẵn duy nhất khó hơn tìm kiếm vật phẩm lẻ xảy ra không? Ôi(n)
A.Schulz

@ A.Schulz Tôi nghĩ rằng đó là thuật toán thời gian bất ngờ bằng cách sử dụng bảng băm. Tôi nhớ rằng ai đó đã nói với tôi một thuật toán O ( n ) (hoặc trong một số trường hợp đặc biệt, giả sử, lẻ = 1 và thậm chí = 2) có thể với stack, nhưng tôi không thể nhớ lại nó. Ôi(n)Ôi(n)
Yai0Phah

Không phải mọi triển khai hashtable đều có thuộc tính này; thông thường, tra cứu không phải là , thậm chí không được khấu hao (afaik). Trong thực tế, một cuộc thảo luận trước đó đã không mang lại bất kỳ triển khai nào có thời gian tra cứu liên tục. Bạn có thể cụ thể hơn không? O(1)
Raphael
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.