Как доказать правильность следующего алгоритма?

Рассмотрим следующий алгоритм min, который принимает списки x, y в качестве параметров и возвращает z-й наименьший элемент в объединении x и y. Предварительные условия: X и Y — отсортированные списки целых чисел в порядке возрастания, и они не пересекаются.

Обратите внимание, что это псевдокод, поэтому индексация начинается с 1, а не с 0.

Min(x,y,z):
    if z = 1:
        return(min(x[1]; y[1]))
    if z = 2:
        if x[1] < y[1]:
            return(min(x[2],y[1]))
        else:
            return(min(x[1], y[2]))

q = Ceiling(z/2) //round up z/2

if x[q] < y[z-q + 1]:
    return(Min(x[q:z], y[1:(z - q + 1)], (z-q +1)))
else:
    return(Min(x[1:q], B[(z -q + 1):z], q))

Я могу доказать, что оно обрывается, потому что z продолжает уменьшаться на 2 и в конце концов достигнет одного из базовых случаев, но я не могу доказать частичную правильность.


person user65065    schedule 21.03.2013    source источник
comment
Привет, я думал, что это больше подходит для компьютерных наук, верно?   -  person user65065    schedule 22.03.2013
comment
Не могли бы вы уточнить, что должен делать алгоритм? Я понял, что вам нужен k-й наименьший элемент среди элементов x и y, т. е. Mix([1,2], [3, 4], 1) = 1 (самый маленький элемент), Mix([1, 2], [3, 4], 2) = 2 (второй наименьший элемент) и т. д. Правильно? Если это так, я не думаю, что приведенный выше алгоритм работает правильно. Даже рекурсии нет.   -  person chris    schedule 23.03.2013
comment
И, конечно же, если нет рекурсии, завершение тривиально. Если бы у вас была рекурсия, ваш аргумент не гарантировал бы завершение (при условии, что вы действительно имели в виду целые числа, а не натуральные числа), поскольку уменьшение отрицательного целого числа могло бы продолжаться (теоретически) вечно, не попадая в базовый случай.   -  person chris    schedule 23.03.2013


Ответы (1)


Ваш код неверен.

Рассмотрим следующий ввод:

x = [0,1]
y = [2]
z = 3

Затем вы получаете q = 2 и в последующем предложении if получаете доступ к y[z-q+1], то есть y[2]. Это нарушение границ массива.

person Manuel Eberl    schedule 01.05.2013