@ifqthenp

Как найти разницу двух чисел в массиве рекурсивно?

Друзья, решал в интернете задачки на рекурсию, попались две, которые никак мозг не осилит: 1) найти два элемента в упорядоченном массиве с разницей 10, используя рекурсию и время O(n). 2) Найти такие же два элемента рекурсивно, но массив не упорядоченный. Есть идеи? В каком направлении двигаться?
  • Вопрос задан
  • 930 просмотров
Решения вопроса 1
Mrrl
@Mrrl
Заводчик кардиганов
Можно было бы как-то так:
static int pres,qres;
static int[] A;
static int M=10;

bool Find1(int p,int q){
  if(A[q]-A[p]==M){ 
    pres=p; qres=q;
    return true;
  }
  if(A[q]-A[p]<M || q-p<2) return false;  
  int k=p+(q-p)/2;
  if(Find1(p,k) || Find1(k,q)) return true;
  return Find2(p,k,k+1,q);
}

bool Find2(int p1,int q1,int p2,int q2){  // p1<=q1<p2<=q2
  if(A[p2]-A[q1]>M || A[q2]-A[p1]<M) return false;
  if(A[p2]-A[p1]==M){
    pres=p1; qres=p2; return true;
  }
  if(A[p1]==A[q1] && A[p2]==A[q2]) return false;
  if(A[q1]-A[p1]>A[q2]-A[p2]){
    int k=p1+(q1-p1)/2;
    return Find2(p1,k,p2,q2) || Find2(k+1,q1,p2,q2);
  }else{
    int k=p2+(q2-p2)/2;
    return Find2(p1,q1,p2,k) || Find2(p1,q1,k+1,q2);
  }
}

(функция Find1 ищет пару в одном фрагменте, Find2 - в двух непересекающихся фрагментах). Но я совершенно не представляю, какая получится сложность. Не исключено, что O(n*log(n)). Зато рекурсия используется по назначению :)
UPD. Немного поправил условия - здесь часто лучше сравнивать не индексы, а сами элементы.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Навскидку:
const D = 10
int N = ...
int a[N] = ...

find(i, j, N):
	d := a[j] - a[i]
	if d = D then
		return (i, j)
	else if d < D then
		if j + 1 == N then
			return nil
		else
			return find(i, j + 1, N)
		end
	else if d > D then
		if i + 1 == N - 1 then
			return nil
		else
			return find(i + 1, j, N)
		end
	end

find(0, 1, N);

Сложность по идее O(2n). Вообще не очень красиво для рекурсивной реализации, но вроде рабочий вариант.
Вторую задачу - сами.
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Фриланс
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы