Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Поиск уникальных значений: как ускорить?

Сообщения:  [1-10]   [11-19] 

 
 автор: HelloMoto   (09.12.2009 в 19:26)   письмо автору
 
   для: АЯ   (09.12.2009 в 16:36)
 

Да, точно!
АЯ, Большое-прибольшое Вам Спасибо!!! :)

  Ответить  
 
 автор: АЯ   (09.12.2009 в 16:36)   письмо автору
 
   для: HelloMoto   (09.12.2009 в 14:53)
 

Вы разберитесь с "текущим вариантом" (с последним кодом) - там как раз ищется по ключу.
И ваш var hash = {}; - он уже "заюзан" как var H = new Array ();
И работает всё как раз быстро как только можно - никакого "поиска по массиву" нет.

  Ответить  
 
 автор: HelloMoto   (09.12.2009 в 14:53)   письмо автору
 
   для: АЯ   (08.12.2009 в 15:54)
 

АЯ, ммм... не совсем то..
Надо заюзать вот это: var hash = {};, где по ключу будем искать.... так как текущий вариант медленно работает из-за поиска в массиве....

  Ответить  
 
 автор: АЯ   (08.12.2009 в 15:54)   письмо автору
 
   для: HelloMoto   (08.12.2009 в 14:29)
 

Если изначально (в первый раз) передаваемый массив будет у вас пустым, то можно.

Но hashmap нужен будет глобальный - до первого обращения к функции вам надо его объявить.
<script>
var H = new Array ();

//...

function arrayUnique (projects, project)
{
var r = (!H [project]) ? true : false; H [project] = 9;
projects [projects.length] = project; return r;
}

//вызов функции arrayUnique ()

  Ответить  
 
 автор: HelloMoto   (08.12.2009 в 14:29)   письмо автору
 
   для: HelloMoto   (08.12.2009 в 13:36)
 

Эх.. всё же ещё вопросик..
а как здесь

for (var r = true, j = 0, l = projects.length; j < l; j++)
if (projects [j] == project) {r = false; break}
projects [l] = project; return r; 

можно заюзать hashmap вместо массива? Ну чтобы не по массиву бегать, а по hashmap...

  Ответить  
 
 автор: HelloMoto   (08.12.2009 в 13:36)   письмо автору
 
   для: АЯ   (07.12.2009 в 23:20)
 

Да, всё ОК!

Спасибо, AlexSol.

Отдельное спасибо вам, АЯ! Спасибо, что вы есть! :)

  Ответить  
 
 автор: АЯ   (07.12.2009 в 23:20)   письмо автору
 
   для: HelloMoto   (07.12.2009 в 22:01)
 

function arrayUnique (projects, project)
{
for (var r = true, j = 0, l = projects.length; j < l; j++)
if (projects [j] == project) {r = false; break}
projects [l] = project; return r;
}

//для проверки
var pros = ['Иванов', 'Петров', 'Сидоров', 'Кузнецов'];
var pro_1 = 'Иванов'; //имеется
var pro_2 = 'Шариков'; //уникальное

alert (arrayUnique (pros, pro_1)); //false для Иванова
alert (arrayUnique (pros, pro_2)); //true для Шарикова

  Ответить  
 
 автор: AlexSol   (07.12.2009 в 23:10)   письмо автору
 
   для: HelloMoto   (07.12.2009 в 22:01)
 

текущее значение всегда будет в массиве. вы проверяйте сначала, а потом добавляйте его.
перенесите в конец функции projects [projects.length] = project;

  Ответить  
 
 автор: HelloMoto   (07.12.2009 в 22:01)   письмо автору
 
   для: АЯ   (07.12.2009 в 19:09)
 

...
for(...){
    if(arrayUnique(projects, project)){...}
}
...
function arrayUnique(projects, project) {
    var isExist;
    projects [projects.length] = project;
    for(var i=0; i <= projects.length; i++){
        if(projects[i] == project){
            isExist = false;
            break;
        } else {isExist = true;break;}
    }
return isExist;
}


С каждым вызовом arrayUnique в цикле for массив projects заполняется разными значениями - как одинаковыми, так и нет. Что-то не то.. работает некорректно :(
Что не так? туплю...
Мне надо возвращать true только тогда, когда текущего значения в массиве нет. Как изменить моё условие, оно неверное, я вижу )

  Ответить  
 
 автор: АЯ   (07.12.2009 в 19:09)   письмо автору
 
   для: HelloMoto   (07.12.2009 в 18:46)
 

Так, вроде бы понял.
Вам по-любому надо Иванова к списку добавить, но при этом сообщить - первый
ли это Иванов в списке или же у него же были однофамильцы в этом списке.

Ну это вы и сами можете сделать:

1. или циклом перебирайте весь массив и сравнивайте с новым элементом; как
только встретите Иванова, так и выходите из цикла брейком (чтобы третьих и
четвертых "ивановых" не искать)

2. или преобразуйте массив в строку (с каким-то уникальным
разделителем) + добавьте этот же разделитель в начало и конец и методом
search () ищите совпадение в этой строке
с RegExp = 'разделитель' + новый_элемент + 'разделитель';.
Но это много медленнее первого варианта.

---
Кстати, зря вы "упёрлись" в метод push () - он тормозной. Запустите:
<script>
var s = [1, 2, 3], d = 4;

function arrayUnique (ar, a) {ar.push (a)}
function faster (ar, a) {ar [ar.length] = a}

var T1 = new Date ().valueOf (); for (var j = 0; j < 98765; j++) arrayUnique (s, d);
var T2 = new Date ().valueOf (); for (var j = 0; j < 98765; j++) faster (s, d);
var T3 = new Date ().valueOf ();

alert ('push () работает ~ в ' + (T2 - T1) / (T3 - T2) + ' раза медленнее');
</script>
и удостоверьтесь.

  Ответить  

Сообщения:  [1-10]   [11-19] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования