Tôi muốn xác định một hàmHaskell: đảo ngược một hoán vị trong thời gian tuyến tính, sử dụng chỉ liệt kê
invert :: [Int] -> [Int]
rằng giả định rằng đầu vào của nó là một hoán vị của [0..(n-1)]
, và trả về nghịch đảo của nó. Có thể xác định nó bằng cách sử dụng chỉ danh sách và bộ dữ liệu (không có mảng) để nó chạy trong thời gian tuyến tính?
Điều này chủ yếu là vì lợi ích học tập; trong mã thực, tôi có thể sử dụng Array
hoặc STArray
hoặc tương tự.
bạn có thể giải thích một nghịch của một hoán vị là những gì danh sách? – Tarrasch
Tarrasch, có một cái nhìn ở đây: http://mathworld.wolfram.com/InversePermutation.html – Kenji
Tôi thích câu hỏi này, nhưng tôi tin rằng nó không thể làm điều đó trong O (n). Một phương pháp đơn giản yêu cầu sắp xếp. Nếu danh sách Haskell hỗ trợ lập chỉ mục O (1) và phụ thêm, thì nó sẽ là có thể. Nhiều thao tác trong 'Data.List' là O (n), vì vậy chúng tôi rất hạn chế về hiệu quả. – Kenji