From db88304d00bb324daa6fb2222389e1e7f86a01c9 Mon Sep 17 00:00:00 2001 From: fer22f <fer22f@gmail.com> Date: Tue, 14 Apr 2020 23:30:10 -0300 Subject: [PATCH] Remove memory access errors --- oficina-busca-binaria/main.cpp | 104 ++++++++++++++++++++++++++++++--- 1 file changed, 97 insertions(+), 7 deletions(-) diff --git a/oficina-busca-binaria/main.cpp b/oficina-busca-binaria/main.cpp index 440ec35..c172ebe 100644 --- a/oficina-busca-binaria/main.cpp +++ b/oficina-busca-binaria/main.cpp @@ -53,8 +53,12 @@ int busca_intervalo_0_n_end (vector<int> a, int n, int target) { } } - if (n > 0) comp++; - return n > 0 && a[lo] == target ? lo : -1; + if (0 <= lo && lo < n) { + comp++; + return a[lo] == target ? lo : -1; + } else { + return -1; + } } int busca_intervalo__1_n (vector<int> a, int n, int target) { @@ -201,6 +205,7 @@ int esquerda_intervalo_0_n_1_ceil_hi (vector<int> a, int n, int target) { } } + comp++; return a[hi] >= target ? hi : hi + 1; } @@ -407,12 +412,32 @@ string found_if_in_odd_array(binary_search_function impl) { return ""; } +vector<int> r (500001); +vector<int> rp_odd (5); +vector<int> rp_even (5); + +string found_if_in_odd_random_array(binary_search_function impl) { + int n = 500000 + 1; + for (int i = 0; i < 5; i++) if (impl(r, n, r[rp_odd[i]]) == -1) { + return "false"; + } + return ""; +} + string found_if_in_even_array(binary_search_function impl) { vector<int> a { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18 }; for (int i = 0; i < 10; i++) if (impl(a, 10, a[i]) == -1) { return "false"; } return ""; } +string found_if_in_even_random_array(binary_search_function impl) { + int n = 500000; + for (int i = 0; i < 5; i++) if (impl(r, n, r[rp_even[i]]) == -1) { + return "false"; + } + return ""; +} + string found_left_in_odd_array(binary_search_function impl) { vector<int> a { 2, 2, 4, 4, 4, 6, 8, 8, 10 }; vector<int> r { 0, 0, 0, 2, 2, 5, 5, 6, 6, 8, 8, 9 }; @@ -474,22 +499,45 @@ void perform_tests( test_binary_search_function test_function; tie(test_name, test_function) = test; + vector<pair<int, string>> results; + + int best_comp = 987654321; + cout << " Teste '" << test_name << "'\n"; - for (auto implementation : implementations) { + for (int i = 0; i < implementations.size(); i++) { string implementation_name; binary_search_function search_function; - tie(implementation_name, search_function) = implementation; + tie(implementation_name, search_function) = implementations[i]; comp = 0; string success = test_function(search_function); - cout << " " << (success == "" ? "\033[32mAC" : "\033[91mWA") << " " << implementation_name; - if (success != "") cout << ": " << success; - cout << " : " << comp << " comparações" << "\033[0m\n"; + + string result = string(success == "" ? "AC" : "WA") + " " + implementation_name; + if (success != "") result += ": " + success; + if (comp) result += " : " + to_string(comp) + " comparações"; + results.push_back(make_pair(comp, result)); + + if (comp != 0 && comp < best_comp) { best_comp = comp; } + } + + for (int i = 0; i < results.size(); i++) { + cout << " "; + if (results[i].second[0] == 'W') { cout << "\033[91m"; } + else if (results[i].first == best_comp) { cout << "\033[32m"; } + else { cout << "\033[94m"; } + cout << results[i].second << "\033[0m\n"; } } } int main() { + generate(r.begin(), r.end(), rand); + sort(r.begin(), r.end()); + for (int i = 0; i < 5; i++) { + rp_even[i] = rand() % 50000; + rp_odd[i] = rand() % 50001; + } + cout << "Buscas" << "\n"; vector<pair<string, binary_search_function>> searches { @@ -513,10 +561,52 @@ int main() { found_if_in_odd_array), make_pair("Elemento encontrado em vetor par", found_if_in_even_array), + make_pair("Elemento encontrado em vetor aleatório ímpar", + found_if_in_odd_random_array), + make_pair("Elemento encontrado em vetor aleatório par", + found_if_in_even_random_array), }; perform_tests(searches, search_tests); + cout << "Buscas usando primeiro elemento a esquerda" << "\n"; + + vector<pair<string, binary_search_function>> success_searches { + make_pair("Esquerda: Intervalo [0, n), resposta lo", + esquerda_intervalo_0_n_lo), + make_pair("Esquerda: Intervalo [0, n), resposta hi", + esquerda_intervalo_0_n_hi), + make_pair("Esquerda: Intervalo [0, n-1], resposta lo", + esquerda_intervalo_0_n_1_lo), + make_pair("Esquerda: Intervalo [0, n-1], resposta hi", + esquerda_intervalo_0_n_1_hi), + make_pair("Esquerda: Intervalo [0, n-1], variável auxiliar", + esquerda_intervalo_0_n_1_aux), + make_pair("Esquerda: Intervalo [0, n-1], teto, resposta lo", + esquerda_intervalo_0_n_1_ceil_lo), + make_pair("Esquerda: Intervalo [0, n-1], teto, resposta hi", + esquerda_intervalo_0_n_1_ceil_hi), + make_pair("Esquerda: Intervalo [0, n-1], teto, variável auxiliar", + esquerda_intervalo__1_n_lo), + make_pair("Esquerda: Intervalo (-1, n), resposta hi", + esquerda_intervalo__1_n_lo), + make_pair("Esquerda: lower_bound", + esquerda_lower_bound) + }; + + vector<pair<string, test_binary_search_function>> success_search_tests { + make_pair("Elemento encontrado em vetor ímpar", + found_if_in_odd_array), + make_pair("Elemento encontrado em vetor par", + found_if_in_even_array), + make_pair("Elemento encontrado em vetor aleatório ímpar", + found_if_in_odd_random_array), + make_pair("Elemento encontrado em vetor aleatório par", + found_if_in_even_random_array) + }; + + perform_tests(success_searches, success_search_tests); + cout << "Primeiro elemento a esquerda" << "\n"; vector<pair<string, binary_search_function>> lefts { -- GitLab