[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Ближайшие к нулю
rocker
Добрый день, вопрос такой.

Имеется массив чисел [1,2,3,-1] (числа могут быть любые)

необходимо из этого массива вывести самое близкое число к нулю и все другие равные ему по модулю.

Пока идей никаких нет( долго ломаю голову. Прошу помощи



Спустя 1 минута, 55 секунд (11.03.2011 - 12:09) Snus написал(а):
rocker
$arr = array('9','5','54','3');
sort($arr);
echo $arr[0];

:D

Спустя 34 секунды (11.03.2011 - 12:10) Michael написал(а):
Цитата
Пока идей никаких нет( долго ломаю голову. Прошу помощи

и это говорит программист sad.gif

Спустя 6 минут, 5 секунд (11.03.2011 - 12:16) rocker написал(а):
Цитата (Snus @ 11.03.2011 - 09:09)
rocker
$arr = array('9','5','54','3');
sort($arr);
echo $arr[0];

:D

К сожалению это не javascript, но идея стоющая)


var arr= new Array [9,5,54,3];
arr.sort(function(a,b) { return a-b; } );
alert(arr[0]);


Сори, и правда вопрос был тупой) перегрузка наверное у меня) :D

Спустя 55 секунд (11.03.2011 - 12:17) twin написал(а):
Snus
Зачем так сложно?))
  $arr = array('9','5','54','3');
echo min($arr);

Спустя 3 минуты, 28 секунд (11.03.2011 - 12:20) rocker написал(а):
Цитата (twin @ 11.03.2011 - 09:17)
Snus
Зачем так сложно?))
  $arr = array('9','5','54','3');
echo min($arr);

минимальное не всегда будет ближайшим у нулю , например -20, 1 1- ближайшее

Спустя 15 секунд (11.03.2011 - 12:21) Snus написал(а):
А блин ) я не увидел, что раздел Javascript.
twin
Можно и так ))

Спустя 6 минут, 55 секунд (11.03.2011 - 12:27) rocker написал(а):
Нашел решение поделив основной массив на 2 1 - отрицательные числа, 2 положительные.

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

Всем спасибо. wink.gif

Спустя 9 минут, 42 секунды (11.03.2011 - 12:37) Snus написал(а):
rocker
Еще как вариант
	function getNV($arr){
foreach($arr as $val) $arr2[abs($val)] = $val;
ksort($arr2);
return array_shift($arr2);
};

$arr = array('-20','6','34','-3','4','-10');
echo getNV($arr);

Спустя 23 минуты, 11 секунд (11.03.2011 - 13:00) rocker написал(а):
итогом будет


/**
* k - основной массив чисел
* Находим ближайшие к нулю
* 1. Делим основной массив на 2, 1 -отрицательные числа, 2 - положительные числа
* 2. Находим в 1 массиве максимальное число, а в 2 минимальное, сравниваем их по модулю
*/


var newArr = new Array(); // Итоговый массив куда запишем все ближайшие к нулю
var first = new Array(); // Первый массив
var second = new Array(); // Второй массив

x = 0;
var s = 0;
var l = 0;

while (x<k.length) {

/**
* Формируем первый массив, только отрицательные числа
*/


if (k[x] < 0) {

first[s] = k[x];
s++;
}

/**
* Формируем второй массив, только положительные числа
*/


if (k[x] > 0) {

second[l] = k[x];
l++;
}

x++;

}

/**
* Находим максимальное в первом массиве
*/


x = 0;

while(x<first.length){

Max=Math.max(first[0], first[x]);
x++;

}

/**
* Находим минимальное во втором массиве
*/


x = 0;

while(x<second.length){

Min=Math.min(second[0], second[x]);
x++;

}

/**
* Первым ближайшим к нулю будет меньший по модулю
*/


var near = Math.min(Math.abs(Max), Math.abs(Min));

/**
* Сканируем основной массив на наличие чисел равных по модулю самому ближнему к нулю
*/


l = 0;
x = 0;

while(x<k.length){

if (Math.abs(k[x]) == Math.abs(near)) {

newArr[l] = k[x];
l++;

}

x++;

}

Спустя 33 минуты, 26 секунд (11.03.2011 - 13:34) Snus написал(а):
rocker
О боже ) Это можно сделать 2 строчками.
массив
var arr = new Array('-20','6','34','-3','4','-10');

2 заветные строчки
function sortNumber(a,b){return Math.abs(a)-Math.abs(b);}
arr.sort(sortNumber);

вывод
alert(arr[0]);

Спустя 1 час, 8 минут, 32 секунды (11.03.2011 - 14:42) Michael написал(а):
var arr = [-100, -20, 19,  90, 300];
var min = Number.MAX_VALUE;
var res = null;
for (i = 0; i < arr.length; i++) {
var diff = Math.abs(arr[i]);
if (diff < min) {
min = diff;
res = arr[i];
}
}

alert(res);


Спустя 4 минуты, 51 секунда (11.03.2011 - 14:47) Snus написал(а):
Michael
Мой вариант лучше tongue.gif

Спустя 16 минут, 49 секунд (11.03.2011 - 15:04) Michael написал(а):
Цитата (Snus @ 11.03.2011 - 13:47)
Michael
Мой вариант лучше tongue.gif

потому что короче по количеству кода или потому что выполняет лишние(тяжелые) операции типа предварительной сортировки всего массива? smile.gif

Спустя 5 минут, 58 секунд (11.03.2011 - 15:10) Snus написал(а):
Michael
Я тебя умоляю ) Ничего "лишнего" и "тяжелого" нет в моем варианте biggrin.gif

Спустя 22 минуты, 46 секунд (11.03.2011 - 15:33) Michael написал(а):
Цитата (Snus @ 11.03.2011 - 14:10)
Michael
Я тебя умоляю ) Ничего "лишнего" и "тяжелого" нет в моем варианте biggrin.gif

сравни просто один пробег по массиву с его сортировкой ...

Минимальный элемент найти, я так понял, ты тоже предлагаешь сначала отсортировать массив и вытащить первый?

Спустя 19 минут, 45 секунд (11.03.2011 - 15:52) Snus написал(а):
Michael
Многотонный массив без проблем моим вариантом обрабатывается. А ты чем подкрепишь слова?
К тому же, возможно автору понадобится вывести 3 наиболее приближенных числа к 0 wink.gif

Спустя 47 минут, 35 секунд (11.03.2011 - 16:40) Michael написал(а):
Цитата (Snus @ 11.03.2011 - 14:52)
Michael
Многотонный массив без проблем моим вариантом обрабатывается. А ты чем подкрепишь слова?
;)

Ты вообще представляешь как данные хранятся в компьютере?
Какие операции и как компьютер выполняет при обработке данных?
Что ему нужно проделать, чтобы отсортировать массив и что чтобы просто пройтись по массиву?

Ну если ты очевидного не видишь(разное качество образования сейчас ;) ), то можно и доказательство:

// заполним массив числами, не равными нулю(+ и -)
var arr1 = [];
for (var i=0; i < 500000; i++) {
var x = parseInt((Math.random() - Math.random()) * 1000, 10);
if (x != 0) arr1.push(x);
}
//alert(arr1.join(' | '));
// end заполним массив


var start = new Date();

var res = michaelfind(arr1);

var end = new Date();
alert('Michael Speed: ' + (end.getTime()-start.getTime()) + ' mc');
alert(res);

var start = new Date();

arr1.sort(sortNumber);
var res = arr1[0];

var end = new Date();
alert('Snus Speed: ' + (end.getTime()-start.getTime()) + ' mc');
alert(res);


function sortNumber(a,b){return Math.abs(a)-Math.abs(b);}

function michaelfind(arr) {
var min = Number.MAX_VALUE;
var res = null;
for (var i = 0; i < arr.length; i++) {
var diff = Math.abs(arr[i]);
if (diff < min) {
min = diff;
res = arr[i];
if (min == 0) break;
}
}

return res;
}


У меня результат:
Michael Speed: 19 mc
Snus Speed: 5325 mc

, т.е. разница В 280 раз ;)

Спустя 16 минут, 35 секунд (11.03.2011 - 16:57) Michael написал(а):
Цитата (Snus @ 11.03.2011 - 14:52)
К тому же, возможно автору понадобится вывести 3 наиболее приближенных числа к 0 wink.gif

и что ? laugh.gif Сложно что ли ?... Хранить их 3 как очередь и новое пришедшее выталкивает из результата самое старое. В школе даже такого легкого не помню чтобы задавали когда то ...

Спустя 27 минут, 38 секунд (11.03.2011 - 17:24) Snus написал(а):
Michael
Твоя взяла. Действительно мой вариант плох для полмиллионного массива. Если речь идет о небольших массивах и экономии места, то я бы использовал свой вариант.

Спустя 4 минуты, 39 секунд (11.03.2011 - 17:29) Snus написал(а):
Цитата (Michael @ 11.03.2011 - 13:57)
и что ? laugh.gif Сложно что ли ?... Хранить их 3 как очередь и новое пришедшее выталкивает из результата самое старое. В школе даже такого легкого не помню чтобы задавали когда то ...

Тут речь не о сложности шла. В твоем варианте изначально не было это учтено.

Спустя 15 часов, 23 минуты, 21 секунда (12.03.2011 - 08:52) Michael написал(а):
Цитата (Snus @ 11.03.2011 - 16:29)
Цитата (Michael @ 11.03.2011 - 13:57)
и что ? laugh.gif Сложно что ли ?... Хранить их 3 как очередь и новое пришедшее выталкивает из результата самое старое. В школе даже такого легкого не помню чтобы задавали когда то ...

Тут речь не о сложности шла. В твоем варианте изначально не было это учтено.

Прикалываешься? А зачем это учитывать? Этого не было в задании. Было бы - другое дело. В твоем варианте не учтено например: вывести ближайший по модулю к нулю и его соседей справа/слева в исходном массиве. Да и еще тысячи фантазий.

Речь шла о конкретно этом задании от ТЗ, и двух его решениях

Спустя 14 часов, 8 секунд (12.03.2011 - 22:52) Snus написал(а):
Michael
Из слов автора я понял именно это.
Цитата
необходимо из этого массива вывести самое близкое число к нулю и все другие равные ему по модулю.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.