Ваш код повторяет счет для каждого вхождения.
Скажем, мы получили массив [5,5,5,5], 5. Начиная с 0,3 в качестве начала, конца,Mid = 1, поэтому вхождение станет 1 (сначала if), затем внутри цикла while, часть else будет рассчитана таким образом, что вхождение станет 2. Теперь вы начинаете с 2,3, поэтому mid равно 2, что снова считается первым оператором if.
Альтернативный подход:
- Создать бинарную функцию поиска, которая возвращает позицию элемента.Запустите его в первый раз, пока не найдете середину скажем х;
- запустить его снова от 0 до x-1 и x + 1 до конца
- Делать это, пока не будет результата для первой половины поиска и второй половины поиска
- Последние известные результаты поиска могут быть вычтены для подсчета количества вхождений.
Пример для моего подхода.
[1, 2, 3, 4, 4, 4,4, 4, 4, 5, 6, 7, 8]
binarysearch = bs (arr, val, start, end) = возвращает позицию val в массиве, иначе -1
pos=bs(arr,val,start,end)
a=pos-1
ppos_a=a
while a!=-1 and a-1>=0:
ppos_a=a
a=bs(arr,val,0,a-1)
b=pos+1
ppos_b=b
while b!=-1 and b+1<=len-1:
ppos_b=b
b=bs(arr,val,b+1,len-1)
result = ppos_b-ppos_a
Это должно подсчитать.Я немного сомневаюсь в сложности, но, похоже, c log n, где c << n </p>