{"id":2374,"date":"2019-12-08T23:26:56","date_gmt":"2019-12-08T20:26:56","guid":{"rendered":"http:\/\/demensdeum.com\/blog\/?p=2374"},"modified":"2024-12-16T22:32:32","modified_gmt":"2024-12-16T19:32:32","slug":"binary-search","status":"publish","type":"post","link":"https:\/\/demensdeum.com\/blog\/pt\/2019\/12\/08\/binary-search\/","title":{"rendered":"Pesquisa bin\u00e1ria"},"content":{"rendered":"<p>Suponha que precisamos descobrir se o endere\u00e7o de e-mail \u201c<a href=\"mailto:demensdeum@gmail.com\">demensdeum@gmail.com<\/a>\u201d est\u00e1 inclu\u00eddo na lista de endere\u00e7os de e-mail permitidos para recebimento de cartas .<\/p>\n<p>Vamos percorrer toda a lista do primeiro ao \u00faltimo elemento, verificando se o elemento \u00e9 igual ao endere\u00e7o especificado &#8211; Vamos implementar um algoritmo de busca linear. Mas isso vai demorar muito ou n\u00e3o?<\/p>\n<p>Para responder a esta pergunta, use a nota\u00e7\u00e3o \u201cComplexidade de tempo dos algoritmos\u201d, \u201cO\u201d. O tempo de opera\u00e7\u00e3o da busca linear no pior caso \u00e9 igual ao en\u00e9simo n\u00famero de elementos do array, vamos escrever isso na nota\u00e7\u00e3o \u201cO\u201d &#8211; Sobre). A seguir, precisamos explicar que para qualquer algoritmo conhecido existem tr\u00eas indicadores de desempenho &#8211; tempos de execu\u00e7\u00e3o do melhor caso, do pior caso e do caso m\u00e9dio. Por exemplo, o endere\u00e7o de e-mail \u201c<a href=\"mailto:demensdeum@gmail.com\">demensdeum@gmail.com<\/a>\u201d est\u00e1 no primeiro \u00edndice do array, ent\u00e3o ele ser\u00e1 encontrado na primeira etapa do do algoritmo, segue-se que o tempo de execu\u00e7\u00e3o \u00e9, na melhor das hip\u00f3teses, &#8211; O(1); e se estiver no final da lista, ent\u00e3o este \u00e9 o pior caso &#8211; Sobre(n)<\/p>\n<p><a href=\"http:\/\/www.peakpx.com\/485573\/yellow-and-black-road-sign\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2387\" src=\"https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2019\/12\/roadSign-1.jpg\" alt=\"\" width=\"320\" height=\"240\" srcset=\"https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2019\/12\/roadSign-1.jpg 320w, https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2019\/12\/roadSign-1-300x225.jpg 300w\" sizes=\"auto, (max-width: 320px) 100vw, 320px\" \/><\/a><\/p>\n<p>Mas e os detalhes de implementa\u00e7\u00e3o de software e desempenho de hardware, eles devem influenciar o grande O? Agora respire fundo e imagine que o c\u00e1lculo da complexidade do tempo \u00e9 calculado para alguma m\u00e1quina abstrata ideal, na qual existe apenas esse algoritmo e nada mais.<\/p>\n<h3>Algoritmo<\/h3>\n<p>Ok, acontece que a pesquisa linear \u00e9 bastante lenta, vamos tentar usar a pesquisa bin\u00e1ria. Para come\u00e7ar, deve-se esclarecer que n\u00e3o trabalharemos com dados bin\u00e1rios; este nome foi dado a este m\u00e9todo devido \u00e0s peculiaridades de seu trabalho. Inicialmente classificamos o array em <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9B%D0%B5%D0%BA%D1%81%D0%B8%D0%BA%D0%BE%D0%B3%D1% 80%D0% B0%D1%84%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BF%D0%BE%D1%80%D1%8F% D0%B4%D0%BE%D0%BA\" target=\"_blank\" rel=\"noopener\">ordem lexicogr\u00e1fica<\/a>, ent\u00e3o o algoritmo pega o intervalo de todo o array, obt\u00e9m o elemento do meio do intervalo, compara-o <a href=\"https:\/\/ru.stackoverflow.com\/questions\/489888\/%D0%A7%D1%82%D0%BE-%D1%82%D0%B0%D0%BA%D0%BE%D0%B5 -% D0%BB%D0%B5%D0%BA%D1%81%D0%B8%D0%BA%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D1% 87%D0%B5%D1%81%D0%BA%D0%BE%D0 %B5-%D1%81%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B8-%D1%87% D1%82%D0%BE-%D0%BE%D0%BD%D0%BE- %D1%81%D0%BE%D0%B1%D0%BE%D0%B9-%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0% D0%B2%D0%BB%D1%8F%D0%B5%D1%82\" target=\"_blank\" rel=\"noopener\">lexicograficamente<\/a>, e dependendo do resultado da compara\u00e7\u00e3o, decide qual intervalo usar para pesquisas adicionais &#8211; a metade superior da corrente ou a parte inferior. Ou seja, a cada etapa da pesquisa \u00e9 tomada uma decis\u00e3o a partir de dois &#8211; l\u00f3gica bin\u00e1ria. Esta etapa \u00e9 repetida at\u00e9 que a palavra seja encontrada ou n\u00e3o seja encontrada (ocorre a intersec\u00e7\u00e3o dos \u00edndices inferior e superior do intervalo).<\/p>\n<p>Desempenho deste algoritmo &#8211; o melhor caso \u00e9 quando um elemento \u00e9 imediatamente encontrado no meio do array O(1), o pior caso de enumera\u00e7\u00e3o \u00e9 O(log n)<\/p>\n<h3>Armadilhas<\/h3>\n<p>Ao implementar a pesquisa bin\u00e1ria, n\u00e3o apenas encontrei o interessante problema da <b>falta de padroniza\u00e7\u00e3o da compara\u00e7\u00e3o lexicogr\u00e1fica<\/b> em bibliotecas de linguagens de programa\u00e7\u00e3o, mas tamb\u00e9m descobri a aus\u00eancia de um <b>padr\u00e3o unificado para implementa\u00e7\u00e3o localeCompare em JavaScript<\/b>. O padr\u00e3o ECMAScript permite diferentes implementa\u00e7\u00f5es desta fun\u00e7\u00e3o, e \u00e9 por isso que ao classificar usando localeCompare, resultados completamente diferentes podem ser observados em diferentes motores JavaScript.<\/p>\n<p>Portanto, para que o algoritmo funcione corretamente, \u00e9 necess\u00e1rio <b>classificar e usar apenas o mesmo<\/b> algoritmo de compara\u00e7\u00e3o lexicogr\u00e1fica, caso contr\u00e1rio nada funcionar\u00e1. Co-mas se, por exemplo, voc\u00ea tentar classificar um array no Scala e pesquisar usando nodejs, sem implementar sua pr\u00f3pria classifica\u00e7\u00e3o\/classifica\u00e7\u00e3o de uma implementa\u00e7\u00e3o, nada o aguardar\u00e1, exceto decep\u00e7\u00e3o com a humanidade.<\/p>\n<h3>Fontes<\/h3>\n<p><a href=\"https:\/\/ru.stackoverflow.com\/questions\/489888\/%D0%A7%D1%82%D0%BE-%D1%82%D0%B0%D0%BA%D0%BE%D0%B5 -% D0%BB%D0%B5%D0%BA%D1%81%D0%B8%D0%BA%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D1% 87%D0%B5%D1%81%D0%BA%D0%BE%D0 %B5-%D1%81%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B8-%D1%87% D1%82%D0%BE-%D0%BE%D0%BD%D0%BE- %D1%81%D0%BE%D0%B1%D0%BE%D0%B9-%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0% D0%B2%D0%BB%D1%8F%D0%B5%D1%82\" target=\"_blank\" rel=\"noopener\">O que \u00e9 compara\u00e7\u00e3o lexicogr\u00e1fica e o que ela representa?<\/a><br \/><a href=\"https:\/\/ru.stackoverflow.com\/questions\/794557\/%D0%9F%D0%BE%D1%87%D0%B5%D0%BC%D1%83-%D0%B4%D0%BB%D1%8F-%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F-%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D0%B8-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%BE%D0%B2-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D1%83%D0%B5%D1%82%D1%81%D1%8F-log-n-%D0%B2%D0%BC%D0%B5%D1%81%D1%82%D0%BE-lb-n\" target=\"_blank\" rel=\"noopener\">\u041f\u043e\u0447\u0435\u043c\u0443 \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f log N \u0432\u043c\u0435\u0441\u0442\u043e lb N?<\/a><br \/>\n<a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%94%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D1%8B%D0%B9_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA\" target=\"_blank\" rel=\"noopener\">\u0414\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a<\/a><br \/>\n<a href=\"https:\/\/habr.com\/ru\/post\/188010\/\" target=\"_blank\" rel=\"noopener\">\u0417\u043d\u0430\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432<\/a><br \/>\n<a href=\"https:\/\/stackoverflow.com\/questions\/52941016\/sorting-in-localecompare-in-javascript\" target=\"_blank\" rel=\"noopener\">https:\/\/stackoverflow.com\/questions\/52941016\/sorting-in-localecompare-in-javascript<\/a><\/p>\n<h3>C\u00f3digo fonte<\/h3>\n<p><a href=\"https:\/\/gitlab.com\/demensdeum\/algorithms\" target=\"_blank\" rel=\"noopener\">https:\/\/gitlab.com\/demensdeum\/algorithms<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Suponha que precisamos descobrir se o endere\u00e7o de e-mail \u201cdemensdeum@gmail.com\u201d est\u00e1 inclu\u00eddo na lista de endere\u00e7os de e-mail permitidos para recebimento de cartas . Vamos percorrer toda a lista do primeiro ao \u00faltimo elemento, verificando se o elemento \u00e9 igual ao endere\u00e7o especificado &#8211; Vamos implementar um algoritmo de busca linear. Mas isso vai demorar<a class=\"more-link\" href=\"https:\/\/demensdeum.com\/blog\/pt\/2019\/12\/08\/binary-search\/\">Continue reading <span class=\"screen-reader-text\">&#8220;Pesquisa bin\u00e1ria&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[61,52],"tags":[131,132],"class_list":["post-2374","post","type-post","status-publish","format-standard","hentry","category-techie","category-tutorials","tag-algorithms","tag-binary-search","entry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"pt","enabled_languages":["en","ru","zh","de","fr","ja","pt","hi"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"ru":{"title":true,"content":true,"excerpt":false},"zh":{"title":true,"content":true,"excerpt":false},"de":{"title":true,"content":true,"excerpt":false},"fr":{"title":true,"content":true,"excerpt":false},"ja":{"title":true,"content":true,"excerpt":false},"pt":{"title":true,"content":true,"excerpt":false},"hi":{"title":false,"content":false,"excerpt":false}}},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2374","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=2374"}],"version-history":[{"count":19,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2374\/revisions"}],"predecessor-version":[{"id":3931,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2374\/revisions\/3931"}],"wp:attachment":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=2374"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=2374"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=2374"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}