2013-07-18 5 views
0

Я создал приложение, в котором пользователь постоянно поворачивает телефон вокруг оси z (рыскания) с помощью экрана телефона вверх. Я хотел бы генерировать угол между двумя крайностями каждый раз, когда направление изменения вращения.Найти последовательные максимальные различия в массиве

Представьте себе массив следующих значений: [-5, -3, -2, 0, 1, 2, 6, 5, 3, 2, -1, -3, -4, -7, -4 , -3, ...]. То, что я хотел бы сделать, это найти относительные максимумы и минимумы массива, чтобы найти различия от одного относительного минимума до следующего относительного максимума. В данном массиве -5 будет первым относительным минимумом, а затем 6 будет следующим относительным максимумом. Разница здесь будет 11 единиц. Из этого относительного максимума 6 следующий относительный минимум равен -7. Разница здесь составит 13 единиц. Процесс будет продолжаться до конца массива. Я хотел бы, чтобы эти значения разностей вводились в собственный массив, т. Е. [11,13, ...]. Был бы очень признателен за любую помощь!

+0

не проблема IOS, как проблема не зависит от устройства и языка; и, конечно же, не имеет ничего общего с Xcode. Существует также множество решений этой проблемы, которые являются одинаково действительными ... – Doc

ответ

0

Как я вижу это ваше первое значение в массиве всегда ваш первоначальный относительный минимум И максимум, поскольку у вас нет абсолютно никакой основы для сравнения с get-go (если вы не разделите оба relMin и relMax на 0 ИЛИ не определите диапазон, чтобы найти ваш relMin и relMax). Имея это в виду, логика, лежащая в основе вашего примера, ошибочна, учитывая ваше предположение об использовании -5 & 6 в качестве первой пары сравнения.

Давайте использовать ваш массив и итерации по массиву с помощью Loop ...

[-5,-3,-2, 0, 1, 2, 6, 5, 3, 2,-1,-3,-4,-7,-4,-3,...] 

0: relMin = -5, Relmax = -5, дельта = 0

1: relMin = -5, -3 = Relmax, дельта = 2

2: relMin = -5, Relmax = -2, дельта = 3

3: relMin = -5, Relmax = 0, дельта = 5

4: relMin = -5, Relmax = 1, дельта = 6

5: relMin = -5, Relmax = 2, дельта = 2

6: relMin = -5, Relmax = 6, дельта = 11

7:

....

13: relMin = -7, Relmax = 6, дельта = 13

....

Эссен что вы делаете, записывает в выходной массив каждый раз, когда ваша текущая дельта не равна предыдущей дельта. Так как изменение между relMin и Relmax является взаимоисключающим (только один из этих значений можно изменить, как вы пройти через массив) все, что вы должны проверить это неравенство ...

//prime your values 
//if it make sense for your purposes prime them both with 0 
//this also assumes you have at least 1 value in valueArray 
relMin = valueArray[0]; 
relMax = valueArray[0]; 

//the following line will always be true if you use valueArray[0] as your relMin and relMax baseline 
deltaArray[0] = 0; 
for (i = 0; i < [valueArray count]; i++) 
{ 
if (valueArray[i] < relMin) 
{ 
    relMin = valueArray[i]; 
} 
if (valueArray[i] > relMax) 
{ 
    relMax = valueArray[i]; 
} 
deltaPrevious = deltaArray[[deltaArray count] - 1]; 
deltaCurrent = relMax - relMin; 
if (deltaCurrent != deltaPrevious) 
{ 
    deltaArray[deltaArray count] = deltaCurrent; 
} 
} 
0

Мой подход к этой проблеме состоял в том, чтобы сначала написать алгоритм, который обнаруживает индексы максимумов и минимумов, а затем находит различия оттуда.

Чтобы получить максимальные и минимальные значения, я бы рекомендовал повторить их через массив и посмотреть на разницу между текущим и предыдущим и следующим значением. Вам нужно посмотреть на изменения в знаке различий: A минимум будет возникать, когда разница будет изменяться с отрицательного на положительное, а максимум произойдет, когда разница будет изменяться с положительного на отрицательный.

Например, посмотрите на эту часть вашего массива: [1,2,6,5,3]. Разница от 1 до 2 положительна, от 2 до 6 положительна, но от 6 до 5 отрицательна. Знак различий изменился с положительного на отрицательный на 6, поэтому мы знаем, что это максимум.

Обратите внимание, что вам также необходимо включить первый и последний элементы как возможные максимальные или минимальные значения.

Как только вы получите индексы максимумов и минимумов, вы сможете легко получить их отличия.

0

В самом базовом смысле вы можете выполнять итерацию по массиву, проверяя, превышает ли следующее значение больше или меньше предыдущего значения. Всякий раз, когда вы достигаете изменения (увеличивалось, теперь уменьшалось или наоборот), вы нашли относительный макс/мин (соответственно). А для цикла для итерации - булевский флаг для проверки (увеличивался или уменьшался) и очевидное знание как текущего, так и предыдущего индекса в массиве для проверки/хранения.

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

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