Я попытался решить одну проблему программирования (ни моя домашняя работа, ни мое интервью/тест, но может быть хорошим кандидатом) в Интернете. Проблема приведена ниже. Мой код ниже функционально корректен, но он имеет сложность времени выполнения O (N), где в качестве ожидаемого решения должно быть значение O (N).Как сделать время выполнения O (N) от O (N^2)
Я попробовал пару других подходов, чтобы оптимизировать его - 1) Сортировал массив, а затем попытался, если бы я мог заставить это работать, но поскольку сортировка приводит к потере индексов исходных чисел, я даже сохранил их в отдельном массив, и сделал это, но даже это закончилось тем, что O (N). Я уверен, что сортировка массива поможет здесь добраться до O (N), но просто не сможет прибить его.
Любая помощь в решении этой проблемы в O (N) с использованием любого подхода была бы полезна.
(Извиняюсь за длинный пост)
Рассмотрим нулевой индексированный массив из N целых чисел. Индексами этого массива являются целые числа от 0 до N-1. Возьмем индекс K. Индекс J называется возведением А, если A [J]> A [K]. Заметим, что если A [K] является максимальным значением в массиве A, то K не имеет восходящих линий.
Ascender J of K называется ближайшим выступающим элементом K, если abs (K-J) является наименьшим возможным значением (т. Е. Если расстояние между J и K минимально). Обратите внимание, что К может иметь не более двух ближайших восходящих: один меньше и больше, чем один К.
Например, рассмотрим следующий массив:
А [0] = 4 А [1] = 3 A [2] = 1 A [3] = 4 A [4] = -1 A [5] = 2 A [6] = 1 A [7] = 5 A [8] = 7
Если K = 3, то к имеет два восходящие: 7 и 8. Его ближайшие восходящий 7 расстояние между K и 7 равна абсом (к-7) = 4.
Написать функцию:
struct Results {
int * R;
int N;
};
struct Results array_closest_ascenders(int A[], int N);
, что при нулевой индексированный массив А целых чисел N, возвращает нулевой индексированный массив R из N целых чисел, таких, что (при К = 0, ..., N-1):
if K has the closest ascender J, then R[K] = abs(K−J); that is, R[K] is equal to the distance between J and K,
if K has no ascenders then R[K] = 0.
Например, для следующей матрицы A:
A [0] = 4 A [1] = 3 A [2] = 1 A [3] = 4 A [4] = -1 A [5] = 2 А [6] = 1 А [7] = 5 А [8] = 7
функция должна возвращать следующий массив R:
R [0] = 7 R [1] = 1 R [ 2] = 1 R [3] = 4 R [4] = 1 R [5] = 2 R [6] = 1 R [7] = 1 R [8] = 0
Массив R должен быть возвращен как:
a structure Results (in C), or
a vector of integers (in C++), or
a record Results (in Pascal), or
an array of integers (in any other programming language).
Предположим, что:
N is an integer within the range [0..50,000];
each element of array A is an integer within the range [−1,000,000,000..1,000,000,000].
Сложность:
expected worst-case time complexity is O(N);
expected worst-case space complexity is O(N), beyond input storage (not counting the storage required for input arguments).
Элементы входных массивов могут быть изменены.
Мое решение (O (N 2 )):
#include <math.h>
#include "stdio.h"
#include "stdlib.h"
struct Results
{
int *R;
int N;
};
struct Results array_closest_ascenders (int A[], int N)
{
struct Results result;
int i,j,asc_found=0;
result.R = (int*)malloc(sizeof(int)*N);
for(i=0;i<N;i++)
result.R[i] = N;
result.N = N;
for(i=0;i<N;i++)
{
asc_found = 0;
for(j=0;j<N;j++)
{
if(A[i] < A[j])
{
//if(result.R[i] == 0)
{
if(result.R[i] > abs(i-j))
{
result.R[i] = abs(i-j);
asc_found = 1;
}
}
}
}
if(asc_found == 0)
result.R[i] = 0;
}
return result;
}
void main()
{
//int A[] = {4, 3, 1, 4, -1, 2, 1, 5, 7};
int A[] = {691446939, -241956306, 485954938, 604054438, 383714185, -656099986, -357341170, -255988102, -139683363, -463281394, -382925609, 712727854};
struct Results tmp;
tmp = array_closest_ascenders(A,sizeof(A)/sizeof(A[0]));
}
Не должен быть 'N' индексом для поиска для восходящих близких? а не # элементов в массиве? –
@Yochai - Вы ошибаетесь. Значения в R [] должны быть наименьшим возможным значением текущего индекса минус индекс, значение которого больше его значения (т. Е. Индекс между текущим значением и его восходящим потоком должен быть минимальным). – goldenmean