2008-11-13 11 views
10

Giả sử chúng ta đang duyệt qua biểu đồ và muốn xác định nhanh xem liệu nút có được nhìn thấy trước đó hay không. Chúng tôi có một vài điều kiện tiên quyết.Tra cứu phần tử nhanh cho một ngôn ngữ chức năng (Haskell)

  1. Nodes đã được đánh dấu với số nguyên giá trị 1..N
  2. Graph được thực hiện với các nút có một danh sách kề
  3. Mỗi giá trị số nguyên từ 1..N xảy ra trong đồ thị dưới, đó là kích thước N

Bất kỳ ý tưởng nào để thực hiện điều này theo cách hoàn toàn có chức năng? (Không cho phép bảng hoặc mảng băm).

Tôi muốn có cấu trúc dữ liệu có hai hàm hoạt động trên đó; thêm (thêm một số nguyên gặp phải) và tra cứu (kiểm tra nếu số nguyên đã được thêm). Cả hai tốt nhất nên dùng thời gian O (n) khấu hao cho N lần lặp lại.

Điều này có khả thi không?

Trả lời

8

Bạn có thể sử dụng Data.Set. Bạn thêm một phần tử bằng cách tạo một tập hợp mới từ phần cũ với insert và vượt qua bộ mới. Bạn tìm kiếm xem một phần tử có phải là thành viên của tập hợp với member hay không. Cả hai hoạt động là O (log n).

Có thể, bạn có thể xem xét sử dụng đơn nguyên trạng thái để chỉ luồng đi qua của bộ này.

+0

Tôi giả định Data.Set sẽ cho hiệu suất logarit hoặc bán không đổi-thời gian trên addToSet và thành viên, trái ngược với hiệu năng thời gian cố định dự kiến ​​với bảng băm? –

+0

Chris, bạn nói đúng. Data.Set chèn và tra cứu hoạt động là O (log n). – namin

+3

Nếu số nguyên của bạn đủ nhỏ cho loại Int, bạn có thể sử dụng Data.IntSet, phiên bản được tối ưu hóa của Set. – mattiast

1

tra cứu yếu tố hiệu quả trong các ngôn ngữ chức năng là khá khó. Data.Set (như được hiển thị ở trên) được thực hiện bằng cách sử dụng một cây nhị phân có thể được xây dựng một cách hoàn toàn chức năng cung cấp các hoạt động tra cứu trong O (log n). HashTables (không hoàn toàn là chức năng) sẽ có O (1).

0

Tôi tin rằng Data.BitSet có thể là O (n).

0

Hãy xem judy hashtables, nếu bạn không nhớ gói mã của mình trong đơn nguyên IO.