PDA

Просмотр полной версии : нахождение минимума


doki
30.10.2007, 20:12
Как найти минимум среди >2 переменных? Math.min работает только для двух
А если у меня переменных 20 штук, мне придется Math.min 19 раз использовать?

etc
30.10.2007, 20:18
var arr = [4,7,8,9,2,4];
function min(arr) {
var l = arr.length;
var m = Number.POSITIVE_INFINITY;

while (l--) {
if (m > arr[l]) {
m = arr[l];
}
}

return m;
}
trace(min(arr));
var arr = [4,7,8,9,2,4];
function min(arr) {
var a = arr.concat();
a.sort(Array.NUMERIC);
return a[0];
}
trace(min(arr));

doki
30.10.2007, 20:27
спасибо, вот эту штуку не знал sort(Array.NUMERIC)

iSextuS
30.10.2007, 22:42
сортировка массива по величине - офигенное решение задачи)
мне даж в голову такое не приходило) :quiet:

etc
30.10.2007, 22:51
Оно медленнее первого варианта.

terbooter
31.10.2007, 09:32
а как определить которое быстрее, а которое медленнее?
байт код?

Смотрю байт код с помощью ASV4 для обоих вариантов, у второго байт код больше,
это и значит что он медленнее?

etc
31.10.2007, 10:14
Нет, по байткоду скорость выполнения определить нельзя.
Скорость выполнения определяется прямо по времени выполнения, простым тестом на пару миллионов итераций. Операции копирования и сортировки медленнее простого обхода массива.

Жень Шень
31.10.2007, 11:43
Привет!
Не ставля под сомнения 2-й вариант от __etc, спрошу: "А почему нельзя его сократить до:"
var arr = [4, 7, 8, 9, 2, 4];
trace(arr.sort()[0]);

etc
31.10.2007, 13:02
Потому что ты изменяешь исходный массив.

Котяра
31.10.2007, 19:15
ну наверное в случае
function min(arr:Array)
{
return (arr.sort()[0]);
}
Это не важно..
другой вопрос как расширить функцию
min(i1,12....in)
На произвольное кол-во элементов?

etc
31.10.2007, 19:19
Котяра, важно, потому как изменение также происходит.
function min() {
return arguments.sort()[0];
}

Жень Шень
31.10.2007, 19:30
Потому что ты изменяешь исходный массив.
Логично! :umnik2:
Тогда так:
var arr = [4, 7, 8, 9, 2, 4];
function min(arr) {
var a = arr.slice(0);
return (a.sort()[0]);
}
trace(min(arr));
:yahoo:

Котяра
31.10.2007, 22:32
Котяра, важно, потому как изменение также происходит.
function min() {
return arguments.sort()[0];
}
Т.е. если я передаю в качестве аргумента массив, то массив меняется?
Типа я передаю ссылку на массив?
Стрянно.. щас потестить не могу, но я думал, что это касается только Object и производных..(мувики итп):eek:

Логично! :umnik2:
Тогда так:
var arr = [4, 7, 8, 9, 2, 4];
function min(arr) {
var a = arr.slice(0);
return (a.sort()[0]);
}
trace(min(arr));
:yahoo:
а чем в этом случае slice лучше? slice ведь не только возвращает элемент, но и портит массив))))) если он портится, в чём я не уверен.

etc
31.10.2007, 22:35
А массив тоже объект и тоже относится к сложным типам данных.

etc
31.10.2007, 22:37
Логично! :umnik2:
Тогда так:
var arr = [4, 7, 8, 9, 2, 4];
function min(arr) {
var a = arr.slice(0);
return (a.sort()[0]);
}
trace(min(arr));
:yahoo:
Аргумент в slice не обязательно указывать. В целом этот вариант ничем не отличается от моего.

Жень Шень
01.11.2007, 11:31
В целом этот вариант ничем не отличается от моего.
Привет!
А так?
var arr = [4, 7, 8, 9, 2, 4];
trace (arr[arr.sort(Array.RETURNINDEXEDARRAY)[0]]);
trace(arr);// контроль неизменяемости
:victory:

Заодно спасибо, __etc, за то, что наконец разобрался с option для сортировки массивов. До этого не приходилось применять. А увидев у тебя в коде NUMERIC, поэксперементировал. Результат выше.

etc
01.11.2007, 12:55
Да вы извращенец, батенька. К чему этот код? Он один фиг работает медленнее, чем простой while.

Жень Шень
01.11.2007, 13:04
Ну! Сразу извращенец! :mad:
Эксперементатор, куда ни шло. Познаю по случаю все возможности и тонкости скрипта. Я же не утверждал, что код этот - панацея. Да и не собираюсь тягаться... с гуру, модераторами.