thắc mắc Hash map tìm kiếm nhanh vậy sao còn phải học Linear search và Binary search

Có vấn đề thị giác à mà không thấy 2 bức hình to vậy còn bảo đưa ? Kém khả năng đọc hiểu à mà không google ra được ? Hay do học hành không tới nơi tới chốn ? Càng nói càng cùn

Big oh (O) – Worst case
Big Omega (Ω) – Best case
Big Theta (Θ) – Average case
Bạn bảo sai thì chứng minh, còn không thì đừng có cùn nữa, kém thật sự :confuse:

Big O = Chặn trên. g(n) = O(f(n)) có nghĩa là tồn tại một hằng số c sao cho g(n) <= c * f(n), với n đủ lớn. Có nghĩa là một thuật toán chạy hết n^2 bước thì gọi là O(n^3) cũng không sai.

Big Theta = Kẹp giữa hai hằng số. f(n) = Theta(g(n)) có nghĩa là tồn tại hai hằng số c1 c2 sao cho c1*g(n) <= f(n) <= c2*g(n).

Big Omega = Chặn dưới bởi một hằng số.

Tốt nhất thì nên tính được Big Theta, bởi vì nó chính xác hơn. Một thuật toán Theta(n^2) thì có nghĩa là số bước thực hiện luôn là bậc 2 chứ không phải bậc khác. Lý do người ta dùng Big O nhiều hơn là vì nó dễ tính hơn. Big Theta thì không phải lúc nào cũng tính được.

Và mấy cái này chỉ là notation để ước lượng mức độ tăng trưởng của một hàm số, chả liên quan gì đến best, average hay worst hết. Không có ai cấm người ta dùng O cho average case hay Theta cho worst case.

Sent from Xiaomi Redmi 5A using vozFApp
 
Last edited:
Và mấy cái này chỉ là notation để ước lượng mức độ tăng trưởng của một hàm số, chả liên quan gì đến best, average hay worst hết. Không có ai cấm người ta dùng O cho average case hay Theta cho worst case.

Sent from Xiaomi Redmi 5A using vozFApp
Cám ơn bác đã bổ sung kiến thức, mình cũng có nói như ví dụ post ở trên là best, worst case ở đây là ý nghĩa khác nhau.
Tên kia thái độ khinh thường người khác quá thể mà lại chả nói được kiến thức nào ra hồn :byebye:
 
Cám ơn bác đã bổ sung kiến thức, mình cũng có nói như ví dụ post ở trên là best, worst case ở đây là ý nghĩa khác nhau.
Tên kia thái độ khinh thường người khác quá thể mà lại chả nói được kiến thức nào ra hồn :byebye:
Vâng bác
Chung quy thì nói đến time complexity thì nên nói rõ đủ các trường hợp ý ra. Chứ phán không không nó O(1) thì đâu đc.

Chứ Engineer mà ông nhõi kia cứ "tưởng", "ngầm định". Ngta vô chỉ rõ best case là O(1) lâu lâu nhảy lên worst case thì O(N) O(logN) tùy implement. Đúng và quá rõ ràng hơn 1 lời phán kiểu học vẹt trên trường : "Hashmap tìm kiếm O(1)"
 
Cám ơn bác đã bổ sung kiến thức, mình cũng có nói như ví dụ post ở trên là best, worst case ở đây là ý nghĩa khác nhau.
Tên kia thái độ khinh thường người khác quá thể mà lại chả nói được kiến thức nào ra hồn :byebye:
Tôi bảo đang đi làm ko type đc

Mà có khi sau khi tui type y hệt cái ông kia, thậm chí hay hơn thì chắc cũng vào chửi cho = được, hoặc nói xiên xẹo, tôi lạ gì anh nữa.

Trên thấy anh ghi đoạn 'worst hơn' nghe đã chối lắm rồi
 
Post đó đugns mà thím.
Khi các key trùng hash. Thì dùng 1 cái balanced tree để lưu trữ cấc key trùng hash , để đạt tới 0(logN)
Đây là lý do mình kêu tùy implement , ko hẳn là O(N)đâuá thím.
Không phải lúc nào cũng dùng balanced tree để lưu các key trùng hash được. Hash table chỉ yêu cầu kiểu dữ liệu của key có hàm hash và có toán tử ==. Nếu dùng balanced tree thì sẽ thêm 1 yêu cầu nữa là phải có các toán tử so sánh. Vậy nên hầu hết implement dùng linked list.
Ngoài ra còn có thể dùng open addressing, nhưng cái này chủ yếu chỉ sử dụng trong hash indexing của dbms.
 
Không phải lúc nào cũng dùng balanced tree để lưu các key trùng hash được. Hash table chỉ yêu cầu kiểu dữ liệu của key có hàm hash và có toán tử ==. Nếu dùng balanced tree thì sẽ thêm 1 yêu cầu nữa là phải có các toán tử so sánh. Vậy nên hầu hết implement dùng linked list.
Ngoài ra còn có thể dùng open addressing, nhưng cái này chủ yếu chỉ sử dụng trong hash indexing của dbms.
Thì nhét toán tử so sánh vào fen?, ngôn ngữ lập trình thì các prime type sẽ đc cài sẵn rùi mình đâu phải lo
 
thì thông thường cái hash map chúng ta sẽ coi là tìm 1 phần tử hết O(1).
Case xấu hơn tí thì O(2,3,4) -> O(log n)

cái hash tốt hay dở là do cái hash function + size table.
Mà implement thì size table sẽ tăng khi số phần tử tăng tới 1 ngưỡng. Hash function thì cũng ko biết cái nào tốt nhất nhưng mấy cái mur mur hash các kiểu thì cũng đủ tốt. Mà giờ ko xài mur mur nữa rồi, giờ xài cái khác thì phải. Nói chung là đủ tốt.

Nên nói chung hiểu cái implement bên trong là dc, còn ai hỏi thì cứ bảo "thông thường tìm kiếm 1 phần tử trong hash map tốn O(1)" là được.
Nhét chữ "thông thường" vào cho khỏi bắt bẻ. Hỏi kỹ hơn thì giải thích thêm.

Chứ giờ cho 100 phần tử trong array, hỏi với 1 thuật toán sort bất kỳ có thể nói dc nó là worst/best hay average case.
Chứ đưa 100 phần tử hỏi nhét vào hashmap rồi lookup từng thằng hết bao nhiêu thì phải đào vô cái hash function, xem cái implement bên trong mới biết được là như nào.
Xui xui cái hash function trả về toàn duplicate thì lại khác.

Quan trọng là biết khi nào xài cái nào thì tốt hơn.
 
Linear search học đầu tiên vì nó dễ học. Đâu ai khùng mà đâm đầu vào học cái khó đầu tiên.

Binary search cũng dễ hiểu, như tìm 1 từ trong cuốn từ điển vậy. Học để áp dụng vô nhiều cái khác nhau, ví dụ tìm nghiệm hàm số trên đoạn [a,b] biết f(a)f(b) < 0. Hay thậm chí balance game ghiếc gì áp dụng binary search cũng được. Tăng damage lên thấy win rate tăng cao quá thì giảm lượng tăng còn phân nửa, win rate vẫn còn cao thì giảm phân nửa nữa v.v... Vậy tìm ra damage tối ưu với ít patch hơn là tăng/giảm dần đều. Thậm chí nấu ăn nêm nếm cũng áp dụng binary search được. Cái gì có yes/no và sắp xếp sẵn là tìm nhị phân được lẹ. Coi phim House gì cũng có 1 tập bệnh nhân bị bệnh nói từ này lộn từ kia, chỉ có yes/no là nói được. Mấy tay bác sĩ có 5 phút để cho bệnh nhân nói thật là tiền sử bệnh gì từ tầm 100 chứng bệnh. Nếu biết binary search thì chả cần tới 5 phút hỏi 7 lần là ra rồi
mgLa64M.png
 
Last edited:
Back
Top