2013-03-25 4 views
4

Учитывая унимодальный массив A из n отдельных элементов (что означает, что его записи в порядке возрастания вплоть до его максимального элемента, после чего его элементы находятся в порядке убывания), целое число p (это длина возрастающей первой части) и k (k-й минимальный элемент). Дайте алгоритм для вычисления значения k-го минимального элемента, который выполняется в O (log n) времени.найти k-й элемент в унимодальном массиве

Пример:

A= {1,23,50,30,20,2} 
p= 2 
k=3 

Ответ: 20

Редактировать

Я попытался это:

def ksmallest(arr1, arr2, k): 
if len(arr1) == 0: 
    return arr2[len(arr2)-k-1] 
elif len(arr2) == 0: 
    return arr1[k] 
mida1 = (int)(len(arr1)/2) 
mida2 = (int)((len(arr2)-1)/2) 
if mida1+mida2<k: 
    if arr1[mida1]>arr2[mida2]: 
     return ksmallest(arr1, arr2[:mida2], k-(len(arr2)-mida2)) 
    else: 
     return ksmallest(arr1[mida1+1:], arr2, k-mida1-1) 
else: 
    if arr1[mida1]>arr2[mida2]: 
     return ksmallest(arr1[:mida1], arr2, k) 
    else: 
     return ksmallest(arr1, arr2[mida2+1:], k) 
+1

Что вы попробовали? – noMAD

+2

Не должно быть 3? – biziclop

+8

С увеличением первой части и уменьшением остатка вы в основном имеете два отсортированных массива. Проверьте [это] (http://stackoverflow.com/a/12555973/1011995) или [это] (http://stackoverflow.com/questions/4607945/how-to-find-the-kth-smallest-element массивы -все-два-сортированные-массивы) или множество других вопросов. –

ответ

0

Для начала еще раз взглянуть на индексах. Вы начинаете с:

if len(arr1) == 0: 
    return arr2[len(arr2)-k-1] 
elif len(arr2) == 0: 
    return arr1[len(arr1)-k-1] 

Но, конечно, если arr1 в порядке возрастания, и arr2 в порядке убывания -й минимальный элемент не будет найден в том же месте.

+0

Хорошая точка, эта часть кода «arr1 [len (arr1) -k-1]» должна быть arr1 [k] – KienMe

+0

Если ваши индексы начинаются с 1, вам также нужно посмотреть на индекс в этой строке: return arr2 [len (arr2) -k-1] – 2013-03-28 13:17:41

Смежные вопросы