Loading...
milena.sapunova avatar milena.sapunova 18 Точки

Java Collections [Homework] - Problem 11* Implement Recursive Binary Search

Здравейте,

Въпросът ми е за последния тест:

Търси се: 4
В поредицата: 4 4 4 4 4 8 8 8

Ако използвам Binary Search не трябва ли да ми върне 3, а не 0. Binary Search започва винаги в средата. В поредицита последния индекс ми е 7. Значи 7 / 2 = 3. След това проверявам дали третия елемент ми е 4 и Binary Search приключва, защото третия елемент е именно 4. Поне аз така разбирам условието:

"Basically, it goes to the middle element and checks it has to continue searching to the left, or to the right." 

1
Fundamentals Module
Ivanov.Ivan avatar Ivanov.Ivan Trainer 558 Точки

Здравей,

По принцип трябва да върне -1 ако го няма в колекцията или индекса, ако го има.

Приложи линк към кода ти за да го разгледаме.

0
milena.sapunova avatar milena.sapunova 18 Точки

Въпросът ми е, защо задачата при тази поредица и това търсено число кава, че Output-a e 0, а не 3. В смисъл 4 го има пет пъти в поредицата 4 4 4 4 4 8 8 8. Защо трябва да върне 0, а не индекса на числото в средата, при положение, че Binary Search според условието трябва да започва в среадата, което ще рече, че веднага намира числото 4:

"Basically, it goes to the middle element and checks it has to continue searching to the left, or to the right." - отивам в средата, намирам 4 и приключвам. Никъде не пише: you need to find the first instance of the number. 

0
29/03/2016 14:49:45
Ivanov.Ivan avatar Ivanov.Ivan Trainer 558 Точки

Извинявай не съм прочел внимателно въпроса.

Според мен е грешка в теста, няма как да върне 0 в този случай, според мен

1
milena.sapunova avatar milena.sapunova 18 Точки

И аз така си мисля...

0
enevlogiev avatar enevlogiev 1168 Точки

Aко връщаше true/false, ок.

В случая, вие нарушавате The principle of least astonishment.

При положение, че връща индекс, всеки с поне малко опит в програмирането би очаквал да види или най-левия елемент, или -1. Въпросният пример е оставен там неслучайно, за да ви подскаже как програмата ви трябва да се държи при наличието на еднакви елементи.

2
Filkolev avatar Filkolev 4482 Точки

Мммм... Всеки, който е наясно какво е двоично търсене ще е изненадан от този резултат, както и авторът на темата. За сравнение може да се тества с вградения BinarySearch(), който ще върне друго. Ако се иска поведение, различно от широко очакваното, трябва ясно да се опише в условието.

3
enevlogiev avatar enevlogiev 1168 Точки

Вградения връща индекса на първия намерен ... хах, ново двайсе.

0
Filkolev avatar Filkolev 4482 Точки

Разбира се, идеята е скорост, да се гарантира логаритмична сложност при търсене. Интересува ни има ли такъв елемент и ако да на кой индекс може да го намерим, не е особено нужно да се знае дали има друг по-напред, това са излишни операции. При линейно търсене се връща първият срещнат; понеже обхождането е от ляво надясно това е най-левият, няма смисъл в общия случай да търсим дали има други след това.

1
enevlogiev avatar enevlogiev 1168 Точки

Прав си за скоростта, ама добре, че никога не съм ползвал държавния метод. Щях да си счупя главата, докато разбера защо ми връща някакви безумни индекси. Най-вероятно щях да реша, че не работя със сортирана колекция.

Иначе, като учих BinarySearch преди няколко месеца, открих и ей тоя хак:

if (arr[middle] == target)
{
   if (middle > 0 && arr[middle] == arr[middle - 1])
       return BinarySearch(target, left, middle - 1);

   return middle;
}

На практика си е logN отвсякъде. С малка промяна в условието може да го накараш да връща и най-десния, ако искаш.

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.