Mọi lập trình viên mới bắt đầu đều yêu thích vòng lặp for vì tiện ích của chúng và mức độ dễ hiểu của chúng. Tương tự như vậy, mọi người đều thích mảng. Tuy nhiên, thường xuyên hơn không, chúng tôi bắt đầu sử dụng mảng cho mọi thứ mà không cần suy nghĩ kỹ. Chúng tôi tham gia các lớp học về cấu trúc dữ liệu nhưng khi thực hành những gì đã học, chúng tôi không đạt được. Mãi đến gần đây tôi mới thấy mình rơi vào cái bẫy này. Tôi đang làm việc với một nhiệm vụ lập trình để thử thách bản thân viết mã hiệu quả và nhanh chóng Chúng ta có thể làm tốt hơn Trong bài đăng này, chúng ta sẽ xem xét ngắn gọn về từ điển và bộ trong Python. Nhưng trước tiên chúng ta cần ôn lại một số khái niệm. Cấu trúc dữ liệu trong ngôn ngữ lập trình là sự triển khai của cấu trúc dữ liệu trừu tượng trong Khoa học máy tính. Từ điển và bộ Python về cơ bản là một bảng băm. Bảng băm là một triển khai của cấu trúc dữ liệu trừu tượng được gọi là mảng kết hợp, từ điển hoặc bản đồ. Nói một cách đơn giản, bảng băm là ánh xạ từ khóa sang giá trị. Đưa ra một khóa, cấu trúc dữ liệu có thể được truy vấn để lấy giá trị tương ứng Một cách đơn giản để thực hiện điều này sẽ là một bảng địa chỉ trực tiếp hoặc một mảng. Mỗi phím chỉ cần ánh xạ tới vị trí tiếp theo trong mảng Có một vấn đề với cách tiếp cận này mặc dù. Nếu có nhiều khóa, kích thước của mảng sẽ rất lớn. Điều này sẽ khiến việc lưu trữ theo bộ nhớ trở nên bất khả thi Một giải pháp cho vấn đề này là sử dụng hàm băm. Hàm băm chịu trách nhiệm ánh xạ khóa tới giá trị được lưu trữ trong bảng băm. Bạn truyền cho nó một khóa và nó tạo ra một giá trị gọi là giá trị băm. Giá trị băm xác định vị trí trong bảng băm để lưu trữ giá trị tương ứng với khóa. Nói cách khác nó là một chỉ số Hình ảnh của tác giả. Sử dụng hàm băm và bảng bămBây giờ, kích thước của bảng băm sẽ nhỏ hơn kích thước của bảng địa chỉ trực tiếp. Điều này có nghĩa là một bảng băm khả thi để triển khai theo bộ nhớ. Tuy nhiên, điều này cũng có nghĩa là hai khóa có thể ánh xạ tới cùng một giá trị. Để giải quyết vấn đề này, chúng ta có thể lưu trữ các giá trị trong danh sách được liên kết nếu hai khóa có cùng giá trị (xem hình trên). Bất kỳ xung đột nào sau đó sẽ chỉ khiến giá trị được thêm vào danh sách được liên kết. Điều này được gọi là giải quyết va chạm bằng cách xâu chuỗi Bây giờ bạn có thể tưởng tượng nếu tất cả các khóa được băm thành cùng một giá trị thì tất cả chúng sẽ được thêm vào danh sách được liên kết, nghĩa là hiệu suất sẽ không tốt hơn so với sử dụng danh sách Các bảng băm được thay đổi kích thước nếu chúng quá đầy. Ngưỡng được gọi là hệ số tải và xác định tỷ lệ của các vị trí được sử dụng so với các vị trí có sẵn. Thông thường khi giá trị vượt quá Tuyệt quá. Bây giờ hãy xem một số ký hiệu O lớn Trở lại vấn đề cơ bản. O(1) so với. Trên)Việc tìm kiếm các phần tử trong một mảng có độ phức tạp về thời gian trường hợp trung bình là Tuy nhiên, đối với bảng băm, độ phức tạp thời gian trường hợp trung bình cho một tìm kiếm là Chèn và xóa các phần tử cũng là Bấm vào đây để xem bảng cheat thực sự hay về cấu trúc dữ liệu và chữ O lớn Được rồi, đã đến lúc viết mã và xem các bảng băm hoạt động Mã & điểm chuẩnChúng ta sẽ mô phỏng nhiệm vụ sau
Nhiệm vụ rất đơn giản. Chúng ta cần tìm giá trị trong Tôi biết có nhiều cách đơn giản hơn để giải quyết vấn đề này nhưng vì mục đích học tập, chúng tôi sẽ thử một cách tiếp cận phức tạp hơn Hàm Thời gian trôi qua cho giải pháp này là khoảng 60 giây Nếu chúng ta phân tích mã cho hàm Các hoạt động chạy trong thời gian bậc hai. Thời gian cần thiết sẽ tương đương với bình phương kích thước đầu vào. Bạn có thể tưởng tượng cách lấy bình phương của các số lớn hơn và lớn hơn sẽ mang lại các giá trị lớn hơn không ngừng Chúng ta có thể làm gì để cải thiện điều này? Thay vì duyệt R để kiểm tra tư cách thành viên, chúng ta có thể triển khai R dưới dạng bảng băm thay vì mảng. Do đó, độ phức tạp về thời gian để kiểm tra tư cách thành viên sẽ là O(1). Đây là tuyến tính trong kích thước của đầu vào. Vì vậy, thời gian cần thiết sẽ tỷ lệ thuận với kích thước đầu vào (trái ngược với bậc hai) Đợi cho đến khi bạn thấy những cải tiến về hiệu suất Thời gian Tóm lại, bạn đã học được động lực đằng sau việc sử dụng hàm băm và bảng băm. Chúng tôi đã xem xét ngắn gọn ký hiệu O lớn cho bảng băm và so sánh nó với ký hiệu của mảng. Trên hết, chúng tôi đã xem xét một triển khai sử dụng bảng băm để giải quyết vấn đề thuật toán trong thời gian kỷ lục Là kỹ sư phần mềm, chúng ta phải biết sử dụng đúng công cụ cho đúng tình huống và không cố gắng áp dụng các kỹ thuật vũ phu trong mọi tình huống mà chúng ta gặp phải Với ý nghĩ đó, có một vài điểm cần nhớ Giống như tất cả mọi thứ, bảng băm không phải là viên đạn bạc. Chúng sẽ không phù hợp với mọi trường hợp sử dụng. Chẳng hạn, các phần tử trùng lặp không thể được lưu trữ trong bảng băm. Vì vậy, nếu trường hợp sử dụng của bạn yêu cầu điều đó, tốt hơn hết bạn nên sử dụng một mảng. Tương tự, bảng băm không được sắp xếp. Nếu trường hợp sử dụng của bạn yêu cầu cấu trúc dữ liệu được sắp xếp, bảng băm không phải là câu trả lời. Cuối cùng, không có chức năng tích hợp để tìm các phần tử tối đa hoặc tối thiểu trong bảng băm. Cuối cùng, độ phức tạp thời gian được đề cập ở trên là trường hợp trung bình. Có thể có những tình huống xảy ra trường hợp xấu nhất có nghĩa là bảng băm sẽ hoạt động giống như mảng |