2016-09-05 15 views
5

Có công thức nào là băm một chiều cho 2 tọa độ (a, b) và (c, d) đến một số nguyên trong đó a, b, c và d là dương? Đặt hàng không vấn đề ở đây, vì vậy công thức sẽ cho kết quả tương tự khi được đưa ra (a, b), (c, d)(c, d), (a, b). Thứ tự của các số thực trong mỗi vấn đề điểm tọa độ ((a, b) không giống như (b, a)). Tốc độ là chìa khóa ở đây, công thức phải nhanh và có độ phức tạp O (1).Hàm băm nhanh cho 2 tọa độ mà trật tự không quan trọng?

Lưu ý - những gì tôi đang làm bây giờ là sắp xếp hai tọa độ bằng cách sử dụng xây dựng của Python trong sắp xếp, và sau đó sử dụng chúng như các khóa trong từ điển được xây dựng trong Python (do đó, tích hợp băm). Tôi cần một cách nhanh hơn để làm điều này để tôi có thể băm hai tọa độ vào một số nguyên bản thân mình.

+0

có giá trị tối đa cho tọa độ của bạn không? –

+0

Không, không có giới hạn cho giá trị x hoặc y. –

+0

bất kỳ yêu cầu nào về va chạm? và có thể bạn có thể sắp xếp chúng theo cách thủ công thay vì sử dụng loại python có một số chi phí cho các danh sách nhỏ như của bạn. –

Trả lời

3

Bạn có thể sử dụng hash() của số frozenset cho việc này.

>>> hash(frozenset([(10, 20), (11, 22)])) 
1735850283064117985 
>>> hash(frozenset([(11, 22), (10, 20)])) 
1735850283064117985 

Hàng chục được thiết kế đặc biệt cho loại trường hợp sử dụng này (tức là hàng chục bộ sưu tập không có thứ tự nội tại không thay đổi và có thể bẻ khóa).

Hy vọng câu trả lời này có quyền của bạn đối với những gì bạn cần :-)

+1

Ồ, tôi không biết về các bộ đông lạnh. Cảm ơn! –

Các vấn đề liên quan