- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
#include <iostream>
#include <cstdlib>
using namespace std;
int bin_search(int *A, int key, int low, int high){
if (low > high){
return 0;
}
int mid = ( low + high ) / 2;
if (A[mid] == key)
return mid+1;
else if( A[mid] < key)
bin_search(A, key, mid + 1, high);
else if (A[mid] > key)
bin_search(A, key, low, mid - 1);
}
int main()
{
int n, k;
cin >> k >> n;
int A[n-1];
for (int i = 0; i < n; i++)
{
cin >> A[i];
}
cout << bin_search(A, k, 0, n);
}
Нужно реализовать бинпоиск рекурсией, на вход значение искомого элемента,
число элементов и сам массив,
вывести номер минимального элемента равного искомому.
У меня откровенно говоря баг, не могу его откопать, помогите!!!
Soul_re@ver 26.09.2013 21:34 # 0
А в чём баг заключается?
Выдаёт не минимальный номер если есть несколько совпадающих значений?
Так у тебя нет проверки на то, что номер найденного элемента — минимальный.
Не работает на не отсортированных массивах?
Так и не должен.
Ну и еботня с индексами и указателем на оригинальный массив вместо двух указателей — тоже говно. Нестандартное (пока) говно.
aesc_smirnov 26.09.2013 21:37 # −3
TarasB 27.09.2013 19:01 # +2
bormand 27.09.2013 19:09 # 0
Оно, конечно, иногда дает копеечку перфоманса, если на n наложены ограничения, и оно невелико, да и покороче, чем вызов alloca... Но толпы обезьян, которые побегут это юзать (т.к. короче чем std::vector), а потом начнут вопить что у них порвало стек, нивелируют все преимущества ;)
Soul_re@ver 27.09.2013 21:52 # 0
aesc_smirnov 26.09.2013 21:40 # −2
определить чему равен номер соответствующего элемента массива.
Если элемент не найден, то вывести 0.
Входные данные
В первой строке расположено искомое число К.
Во второй - количество элементов в массиве N <= 10000.
Далее расположены N целых чисел, упорядоченных по возрастанию.
Выходные данные
Выведите наименьший номер найденного значения, или 0, если элемент не найден.
WGH 26.09.2013 21:56 # 0
aesc_smirnov 26.09.2013 21:58 # 0
Soul_re@ver 26.09.2013 22:14 # +3
Почему бы не взять std::lower_bound из <algorithm>?
anonimb84a2f6fd141 26.09.2013 22:00 # −1
2. mid принимает питушарские значения.
aesc_smirnov 26.09.2013 22:00 # −1
anonimb84a2f6fd141 26.09.2013 22:26 # −1
bormand 26.09.2013 22:41 # 0
Переполнение и залет в минус будет только на 16-битном компилере при n в районе 32к, или на 32-битном при n в районе двух лярдов. Оба случая маловероятны.
Или я совсем туплю?
aesc_smirnov 26.09.2013 22:45 # −1
bormand 26.09.2013 22:48 # 0
Значит, скорее всего, или ввод или вывод багует. На контрольном примере, который в задании, все работает?
aesc_smirnov 26.09.2013 22:48 # −1
bormand 26.09.2013 22:50 # 0
P.S. Что-то косяки настолько простые, что я уже давным-давно не видел их в коде, с которым работаю, и из-за этого потерял на них нюх, и тупо в упор не вижу... Что этот endl, что return, что A[n-1]... А может просто пора спать...
aesc_smirnov 26.09.2013 22:53 # −1
bormand 26.09.2013 22:54 # 0
aesc_smirnov 26.09.2013 22:55 # −1
bormand 26.09.2013 22:55 # 0
n-1 же... обсуждалось же ниже.
Прошел?
aesc_smirnov 26.09.2013 22:56 # −1
bormand 26.09.2013 22:56 # 0
aesc_smirnov 26.09.2013 22:58 # −2
for (int i = 0; i < n; i++)
{
cin >> A[i];
}
cout << bin_search(A, k, 0, n-1) << endl;
}
aesc_smirnov 26.09.2013 23:01 # −1
if (low > high){
return 0;
}
int mid = ( low + high ) / 2;
if (A[mid] == key)
return mid+1;
else if( A[mid] < key)
return bin_search(A, key, mid + 1, high);
else if (A[mid] > key)
return bin_search(A, key, low, mid - 1);
}
int main()
{
int n, k;
cin >> k >> n;
int A[n-1];
for (int i = 0; i < n; i++)
{
cin >> A[i];
}
cout << bin_search(A, k, 0, n-1) << endl;
}
bormand 26.09.2013 23:04 # 0
Soul_re@ver 26.09.2013 23:05 # +1
Проверь на данных:
4
8
1 4 4 4 4 4 4 9
и ты обнаружишь, что твоя программа не выдаёт 2, как должна.
Это цена велосипедостроительства.
aesc_smirnov 26.09.2013 23:07 # −2
Soul_re@ver 26.09.2013 23:09 # +1
aesc_smirnov 26.09.2013 23:10 # −2
bormand 26.09.2013 23:08 # 0
Если там есть такой тест - то условие, имхо, неполное. Тут же не сказано upper bound искать, lower bound, или же вообще любое подходящее:
найти число K в упорядоченном массиве из N элементов и
определить чему равен номер соответствующего элемента массива
Soul_re@ver 26.09.2013 23:10 # +1
> Выведите наименьший номер найденного значения, или 0, если элемент не найден.
aesc_smirnov 26.09.2013 23:11 # −1
Soul_re@ver 26.09.2013 23:16 # +1
Разберись с принципом работы алгоритма, переделай итерацию в рекурсию и всё заработает.
bormand 26.09.2013 23:12 # 0
Тьфу ёпт. Точно. Всё, я пошел спать, невнимательность прёт изо всех щелей ;)
aesc_smirnov 26.09.2013 23:12 # −2
aesc_smirnov 26.09.2013 22:57 # −1
bormand 26.09.2013 23:03 # 0
anonimb84a2f6fd141 26.09.2013 23:04 # +1
bormand 26.09.2013 22:07 # 0
В крестах это гццизм: http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Variable-Length.html. Если хочется портабельности - лучше не юзать VLA за пределами чистой сишки ;)
anonimb84a2f6fd141 26.09.2013 22:24 # 0
Если int A[n-1] будет иметь n элементов, то этот гццизм - питушня. Если int A[n-1] не будет иметь n элементов, то код - питушня.
bormand 26.09.2013 22:31 # 0
aesc_smirnov 26.09.2013 22:32 # 0
bormand 26.09.2013 22:48 # 0
Это заодно ответ на вопрос о n>100000 и даже о n>100000000.
bormand 26.09.2013 22:02 # 0
P.S. ГК это не место для исправления лаб.
aesc_smirnov 26.09.2013 22:13 # −1
bormand 26.09.2013 22:15 # 0
Ибо сишка, а не пасцаль. Ты только что словил buffer overflow, запилив массив на один элемент меньше, чем положено :)
aesc_smirnov 26.09.2013 22:17 # −1
bormand 26.09.2013 22:18 # 0
Спасибо в карман не положишь ;)
Тест то прошел, или дальше мучаем?
aesc_smirnov 26.09.2013 22:18 # −1
bormand 26.09.2013 22:24 # 0
P.S. Все, мне пора спать, таких очевидных косяков не вижу. С тебя пиво ;)
aesc_smirnov 26.09.2013 22:25 # −1
bormand 26.09.2013 22:27 # 0
Это хардкорные кресты, которые не прощают ошибок (и, компиляторы зачастую, не говорят о них).
Функция, которая должна была вернуть int, но завершилась, не сделав этого, имеет полное право вернуть мусор... Или вернуть правильный ответ... Никто не знает что именно произойдет. Это UB.
aesc_smirnov 26.09.2013 22:29 # −1
bormand 26.09.2013 22:29 # +1
В жопу.
return bin_search(A, key, mid + 1, high);
Прошел тест?
aesc_smirnov 26.09.2013 22:33 # −1
bormand 26.09.2013 22:39 # 0
aesc_smirnov 26.09.2013 22:39 # 0
guest8 21.07.2020 23:47 # −999
TOPT 22.07.2020 03:01 # 0
aesc_smirnov 26.09.2013 22:24 # 0
aesc_smirnov 26.09.2013 22:13 # −1
Stertor 27.09.2013 10:42 # −3
Bobik 27.09.2013 13:06 # +8
На лекциях вам рассказывалось, какой в правом и левом бинпоиске должен быть инвариант, и что строки "if (A[mid] == key) return mid+1;" быть не должно, если нужен не произвольный элемент, равный заданному, а самый правый или самый левый.
defecate-plusplus 27.09.2013 13:13 # +4
spivti 27.09.2013 14:55 # 0
defecate-plusplus 27.09.2013 15:00 # +6
питух и Царь - неделимы, как инь и янь, как ленин и партия, как левое яйцо и правое яйцо
питушино-царский когнитивный дуализм
spivti 27.09.2013 15:03 # 0
defecate-plusplus 27.09.2013 15:03 # +2
spivti 27.09.2013 15:09 # 0
на питоне он уничтожается легко [python] del Царь [/python]
defecate-plusplus 27.09.2013 15:17 # +7
в них вся мудрость поколений и советы лучших птицеводов
spivti 27.09.2013 15:26 # −1
Stertor 27.09.2013 16:02 # 0
3.14159265 21.07.2020 23:38 # +1
> Царь - злая анскильная сторона питуха
Мощно!
guest8 21.07.2020 23:41 # −999
1024-- 19.11.2017 19:12 # +2
Bobik 20.11.2017 00:05 # +4
guest8 21.07.2020 23:42 # −999
guest8 21.07.2020 23:46 # −999
Playermet 27.09.2013 13:07 # +1
eth0 27.09.2013 17:56 # +4