Khác biệt giữa bản sửa đổi của “Tìm kiếm nhị phân”

Nội dung được xóa Nội dung được thêm vào
Không có tóm lược sửa đổi
Không có tóm lược sửa đổi
Dòng 146:
Thuật toán tìm kiếm nhị phân cần ba con trỏ để trỏ tới các phần tử, bất kể kích thước của mảng; đó có thể là chỉ số các phần tử trong mảng hoặc con trỏ tới địa chỉ trong bộ nhớ. Tuy nhiên, thuật toán cần ít nhất <math>\left \lceil \log_2(n) \right \rceil</math> bit để mã hóa một con trỏ tới một phần tử trong mảng có <math>n</math> phần tử.<ref>{{cite journal |author=Shannon, Claude E. |authorlink=Claude Shannon |title=A Mathematical Theory of Communication |journal=[[Bell System Technical Journal]] |volume=27 |issue=3 |pages=379–423 |date=July 1948 |doi=10.1002/j.1538-7305.1948.tb01338.x|hdl=11858/00-001M-0000-002C-4314-2 }}</ref> Do đó, độ phức tạp không gian của tìm kiếm nhị phân là <math>O(\log n)</math>. Ngoài ra, thuật toán còn cần <math>O(n)</math> không gian để lưu trữ mảng.
 
=== DerivationTrường ofhợp averagetrung casebình ===
Số phép lặp trung bình được thực hiện bởi thuật toán tùy thuộc vào xác suất mỗi phần tử được thực hiện tìm kiếm. Trường hợp trung bình khi tìm kiếm thành công và không thành công là khác nhau. TheTa averagegiả numbersử ofmỗi iterationsphần performedtử by binaryxác searchsuất dependsđược ontìm thenhư probabilitynhau ofnếu eachtìm elementkiếm beingthành searchedcông. TheNếu averagetìm casekiếm iskhông differentthành for successful searches and unsuccessful searches. It will be assumed that each element is equally likely to be searched for successful searches. For unsuccessful searchescông, itta willgiả besử assumed that thecác [[IntervalKhoảng (mathematicstoán học)|intervalskhoảng]] betweengiữa và ngoài các andphần outsidetử elements arexác equallysuất likelyđược totìm begiống searchednhau. Trường hợp trung bình khi tìm kiếm thành công là số phép lặp cần thực hiện để tìm mọi phần tử chính xác một lần, chia cho <math>n</math>, số phần tử trong mảng. Trường hợp trung bình khi tìm kiếm không thành công là số phép lặp cần thực hiện để tìm một phần tử trong mọi khoảng chính xác một lần, chia cho <math>n + 1</math> khoảng.{{Sfn|Knuth|1998|loc=§6.2.1 ("Searching an ordered table"), phân mục "Further analysis of binary search"}}
 
==== Tìm kiếm thành công ====
<!-- E stands for "expected" -->
Khi biểu diễn bằng cây nhị phân, một lần tìm kiếm thành công có thể được biểu diễn bằng một đường đi từ gốc tới nút cần tìm, gọi là ''đường trong'' (''internal path''). Độ dài của một đường là số edges (connectionsđường betweennối nodesgiữa các nút) mà đường đó đi qua. Số phép lặp mà một lần tìm kiếm thực hiện, với điều kiện độ dài của đường tương ứng với lần tìm đó là <math>l</math>, là <math>l + 1</math> tính cả phép lặp ban đầu. ''Độ dài đường trong'' (''internal path length'') là tổng độ dài tất cả các đường trong. Do chỉ có một đường duy nhất từ gốc tới bất cứ nút nào, mỗi đường trong đó biểu diễn cho một phép tìm kiếm phần tử tương ứng. Nếu có <math>n</math> phần tử, và độ dài đường trong là <math>I(n)</math>, thì số phép lặp trung bình cho một lần tìm kiếm thành công là <math>T(n) = 1 + \frac{I(n)}{n}</math>, trong đó đã cộng thêm một bước lặp ở đầu.{{Sfn|Knuth|1998|loc=§6.2.1 ("Searching an ordered table"), phân mục "Further analysis of binary search"}}
 
Do tìm kiếm nhị phân là thuật toán tối ưu cho việc tìm kiếm bằng cách so sánh, bài toán được đơn giản hóa thành việc tính độ dài đường trong tối thiểu của tất cả cây nhị phân có <math>n</math> nút, tức là bằng:{{Sfn|Knuth|1997|loc=§2.3.4.5 ("Path length")}}
Dòng 180:
 
==== Tìm kiếm không thành công ====
UnsuccessfulTa searches canthể bebiểu representeddiễn bylần augmentingtìm thekiếm treekhông withthành công bằng cách thêm vào cây các ''externalnút nodesngoài'', whichtạo forms anthành ''extendedcây nhị phân binarymở treerộng''. Nếu một nút trong, hoặc một nút có trong cây, có ít hơn hai nút con, thì ta sẽ thêm vào các nút con bổ sung, gọi là các nút ngoài, để mỗi nút trong đều có hai nút con. By doing so, an unsuccessful search can be represented as a path to an external node, whose parent is the single element that remains during the last iteration. AnMột ''đường ngoài'' (''external path'') is amột pathđường fromđi thetừ rootgốc tođến anmột externalnút nodengoài. The ''external path length'' is the sum of the lengths of all unique external paths. Nếu số phần tử là <math>n</math> (<math>n</math> là số nguyên dương), và độ dài đường ngoài là <math>E(n)</math>, thì số phép lặp trung bình cho một lần tìm kiếm không thành công là <math>T'(n)=\frac{E(n)}{n+1}</math>, trong đó đã tính một phép lặp lúc đầu. Trong công thức này, ta lấy độ dài đường ngoài chia cho <math>n+1</math> chứ không phải <math>n</math> vì có <math>n+1</math> đường ngoài biểu diễn cho các khoảng giữa và ngoài các phần tử trong mảng.{{Sfn|Knuth|1998|loc=§6.2.1 ("Searching an ordered table"), subsection "Further analysis of binary search"}}
 
Tương tự, bài toán này có thể đơn giản hóa thành bài toán tính độ dài đường ngoài tối thiếu của tất cả cây nhị phân có <math>n</math> nút. Với tất cả các cây nhị phân, độ dài đường ngoài bằng độ dài đường trong cộng với <math>2n</math>.{{Sfn|Knuth|1997|loc=§2.3.4.5 ("Path length")}} Thay <math>I(n)</math> vào ta có:{{Sfn|Knuth|1998|loc=§6.2.1 ("Searching an ordered table"), subsection "Further analysis of binary search"}}
Dòng 200:
Trong quá trình phân tích hiệu suất của thuật toán, một vấn đề khác cần lưu ý là thời gian cần để so sánh hai phần tử. Với các số nguyên và chuỗi ký tự, khoảng thời gian này tăng tuyến tính do độ dài mã hóa (thường là số [[bit]]) của các phần tử tăng theo. Ví dụ, một cặp số nguyên dương 64 bit sẽ cần phải so sánh số bit gấp đôi so với một cặp số nguyên dương 32 bit. Trường hợp tệ nhất được đạt đến khi hai số nguyên bằng nhau. Điều này có thể đáng lưu tâm khi độ dài mã hóa của các phần tử ở mức lớn, ví dụ như khi so sánh các số thuộc kiểu nguyên lớn hơn hay so sánh các chuỗi ký tự dài, khiến cho việc so sánh rất tốn thời gian. Hơn nữa, so với các số nguyên hoặc chuỗi ký tự ngắn thì so sánh các giá trị [[Số thực dấu phẩy động|dấu phẩy động]] (cách biểu diễn số thông dụng nhất của [[số thực]]) thường còn tốn thời gian hơn..
 
OnTrên mosthầu computerhết architectures,các thekiểu kiến trúc máy tính, [[CentralCPU|bộ processingvi unit|processorxử lý]] has abộ hardwarenhớ [[Cache (computingtin học)|cache]] separateriêng fromtách biệt khỏi [[Random-access memory|RAM]]. SinceDo theynằm arengay locatedtrong withinbộ thexử processor itself, cachesbộ arenhớ muchcache faster tothể accesstruy butcập usuallynhanh storehơn muchnhưng lessthường datachỉ thanchứa được ít dữ liệu hơn RAM. ThereforeDo đó, mosthầu processorshết storecác memorybộ locationsxử that havelưu beenđịa accessedchỉ recently,những alongvùng withbộ memorynhớ locationsđã closeđược totruy itcập gần đây và cả những vùng bộ nhớ xung quanh chúng. For exampledụ, whenkhi antruy arraycập elementvào ismột accessedphần tử trong mảng, thephần elementtử itselfnày, maycùng bevới storedcả alongnhững withphần thetử elementsđược thatlưu aregần storedđó, close tothể itđược inlưu vào trong RAM, makingđể itsau fasterđó to sequentiallythể accesstruy arraycập elementsnhanh thathơn aređược closevào incác indexphần totử eachkhác otherliền kề ([[tính địa phương trong truy xuất - ''locality of reference]]''). OnVới một mảng ađã sortedsắp arrayxếp, binaryquá searchtrình cantìm jumpkiếm tonhị distantphân memory locationsthể ifphải thenhảy arraysang iscác largevùng bộ nhớ nằm xa nếu mảng có kích thước lớn, unlikekhông algorithmsgiống (suchnhư ascác thuật toán (như [[lineartìm kiếm tuyến searchtính]] andhay [[linear probingtuyến tính]] introng [[hashbảng tablesbăm]]) whichtruy accesscập elementscác inphần sequencetử theo thứ tự lần lượt. ThisĐiều addsnày slightlylàm tothời thegian runningchạy timecủa ofthuật toán tăng lên đôi chút với các binarymảng searchlớn fortrên largehầu arrayshết oncác mosthệ systemsthống.<ref>{{cite journal|last1=Khuong|first1=Paul-Virak|last2=Morin|first2=Pat|author2-link= Pat Morin |title=Array Layouts for Comparison-Based Searching|journal=Journal of Experimental Algorithmics|volume=22|at=Article 1.3|doi=10.1145/289251.289255}}</ref>
 
==Mở rộng==