Найти целое число, которое не находится рядом с целыми числами в NSMutableArray - PullRequest
1 голос
/ 12 октября 2011

У меня есть NSMutableArray, в котором 5 значений изначально установлены в ноль.Он содержит x-координату элементов на экране и обновляется каждую 1/60 секунды.Положение каждого предмета постоянно меняется.На экране может быть не более 5 элементов и не менее 1 в любое время.

Каждый элемент в массиве будет находиться в диапазоне от 0 до 480 (высота экрана iphone).Примером массива в данный момент времени будет:

{123,450,0,0,0}

, который может затем измениться на:

{150,320,90,0,0}

Мне нужен быстрый способ найти позицию, которая не находится рядом с какой-либо позицией в массиве.Это может быть позиция, которая не находится в заданном диапазоне вокруг каждого значения (например, значение не находится в пределах 50 от любых элементов в массиве) или позиция с наибольшим расстоянием по обе стороны от него.

Очевидно,если найти позицию в пределах определенного диапазона невозможно, следует выбрать лучшее решение.

Это должно быть быстро, так как новый элемент добавляется на экран, чтобы любая задержка в выборе новой позиции замедлялась.вниз по игровому тикеру - так что цикл while не предпочтителен.

Надеюсь, есть простой математический метод в target-c, который может это отсортировать.Я действительно застрял в том, как я должен достичь этого.Любая помощь МНОГО приветствуется.

Ответы [ 2 ]

1 голос
/ 12 октября 2011

Позвольте мне немного перефразировать этот вопрос. У вас есть очки p1,p2,p3,p4,p5 такие, что

0 <= p_i <= 480

Вы хотите найти точку x такую, что

0 <= x <= 480

, которая максимизирует функцию

min_{x} ( |p1-x| + |p2-x| + |p3-x| + |p4-x| + |p5-x| )

Если это ваша цель (и мне не ясно, так оно или должно быть), то вы можете решить эту проблему, проверив, какое из следующих потенциальных значений x максимально увеличивает расстояние:

0 , p1/2 , p1 + (p2-p1)/2 , p2 + (p3-p2)/2 , ... , p5 + (480-p5)/2

это предполагает 0 <= p1 <= p2 <= p3 <= p4 <= p5 <= 480. Какой из различий больше, тем ответом следует выбрать.

Например, для

{123,450,0,0,0}

ответ 123 + (450-123)/2.

Для

{150,320,90,0,0} 

ответ 150 + (320-150)/2

Чтобы кодировать это в Objective-C, вам нужна функция, которая возвращает index от максимальной записи массива. Возьмем для ввода значение p1,p2,...,p5. Сортируйте их в порядке возрастания, добавьте 0 слева и 480 справа. Затем создайте новый массив длиной на единицу меньше, что даст последовательные различия, например, {p1-p0, p2-p1, ..., p6-p5}, где p0 = 0 и p6 = 480. Наконец, получите индекс максимума этого нового массива, назовите его i и верните оптимальную позицию p_i + (p(i+1)-p_i)/2.

* * Пример 1 042:

вход : {150,320,90,0,0}

переставить на {0 , 0 , 0 , 90 , 150 , 320 , 480}

Разностный массив {0 , 0 , 90 , 60 , 170 , 160}

максимум по индексу 4

ответ 150 + (320-150)/2

0 голосов
/ 12 октября 2011

Я не думаю, что есть объект Objective-C, который сделает это за вас - вам действительно придется заняться программированием.

Первая идея, которая приходит на ум, - это какое-то дерево, но это не простое B-дерево или что у тебя есть. Возможно, декартово дерево, но как именно это применить, сейчас мне не подходит.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...