Вход | Регистрация

  1  2  3
1С:Предприятие ::

Метки:коллекции значений

НайтиЗначение() в ТЗ по двум колонкам. Возможно ли?

Я
   User63
03.08.04 - 12:18
Допустим, у меня есть таблица значений с колонками номенклатура и партия. Можно ли методом НайтиЗначение() получить строку по этим двум параметрам, например,предварительно создав дополнительную колонку и какаим нибудь образом скопировав туда значения этих двух вышеуказанных колонок?
Спасибо.
 
  Рекламное место пустует
   Warlock
 
201 - 04.08.04 - 17:04
(200)Я не говорю, что я гениален. Я же человек, могу и ошибаться...
   Тор
 
202 - 04.08.04 - 17:09
(Варлок) Опиши как ты понимаешь код в (24) если не сложно
   IAm
 
203 - 04.08.04 - 17:11
:)))
   Z1
 
204 - 04.08.04 - 17:23
(197) Не я на деньги не спорю.
   Тор
 
205 - 04.08.04 - 17:26
(203) Молчание Варлока достаточно красноречиво. И он еще говорит, чтобы я не прикрывался тобой. Я вот к слову код понимаю нормально.
   Warlock
 
206 - 04.08.04 - 17:27
Тор - это, наверно, моя тень. Очень вредная... ;))

Функция ПоискПоДвумКолонкам(ТЗ,Значение1,Значение2,Колонка1,Колонка2)
Перем ТЗ_;   
//Объявляем переменную для временной ТаблицыЗначений

ТЗ.Выгрузить(ТЗ_); 
//Выгружаем все данные из основной ТЗ в дополнительную (ТЗ_)

ИндексПоиска = 0;
//ИндексПоиска - доп. переменная, кот. содержит номер реквизита, который нашелся

Пока 1=1 Цикл//Запускаем вечный цикл. Выход по доп. условию.

   //Если найден номер строки, в которой встречается значение одного из искомых реквизитов, ищем другой

    Если ИндексПоиска <> 1 Тогда
        Поз1=0; 
        ТЗ_.НайтиЗначение(Значение1,Поз1,Колонка1); 
    КонецЕсли; 
    Если ИндексПоиска <> 2 Тогда 
        Поз2 =0; 
        ТЗ_.НайтиЗначение(Значение2,Поз2,Колонка2);   
    КонецЕсли;
   //В Поз1 и Поз2 - Номера строк, в которых есть значения, удовлетворяющие поиску.

    Если (Поз1=0) ИЛИ (Поз2=0) Тогда 
       //Какое-то или оба значения не нашлись....

        Возврат(0) 
    ИначеЕсли Поз1 = Поз2 Тогда 
       //Обя значения в одной строке - это и есть искомая строка!

        Возврат Поз1; 
    ИначеЕсли Поз1 > Поз2 Тогда 
       // Исходя из значнений Поз1, Поз2 обнуляем значения в ТЗ_, чтобы НайтиЗначение() больше не срабатывала на найденных значениях

        ТЗ.Заполнить("", 1, Поз1 - 1, Колонка2); 
        ИндексПоиска = 1; 
    Иначе 
        ТЗ.Заполнить("", 1, Поз2 - 1, Колонка1); 
        ИндексПоиска = 2; 
    КонецЕсли; 
КонецЦикла;

Объяснил?
   Тор
 
207 - 04.08.04 - 17:27
+205. Кстати потому что понимаю, потому и уважаю автора.
   Warlock
 
208 - 04.08.04 - 17:31
(Тор)Ну?
   Тор
 
209 - 04.08.04 - 17:31
(Варлок) Эх, молодежь... Пойми, понять код и ПРИДУМАТЬ код разные вежи
   Warlock
 
210 - 04.08.04 - 17:32
(209)Может ты и не веришь, но я _знаю_ эту разницу...
 
  Рекламное место пустует
   Тор
 
211 - 04.08.04 - 17:34
(Варлок) Да верю, верю, не нервничай. Хочешь еще вопросик?
   Warlock
 
212 - 04.08.04 - 17:35
(211)Только в отдельной ветке!
   Тор
 
213 - 04.08.04 - 17:38
(Варлок) Давай подадим пример. Я буду задавать вопросы, ты на них отвечать. Потом можно будет оценить уровень вопросов и ответов и возможно добавить тебе звезду, может и две. Может звезды потом так давать будут: типа по результатам тестов.
   Warlock
 
214 - 04.08.04 - 17:43
(213)Ты еще скажи, что это твоя идея... :)
"Я буду задавать вопросы, ты на них отвечать." - это форум;
"Потом можно будет оценить уровень вопросов и ответов и возможно добавить тебе звезду, может и две." - вроде так и работает. Волшебник оценяет(-нял);
"Может звезды потом так давать будут: типа по результатам тестов." - была ветка по обсуждению данной темы. Вроде утопилась...
   Тор
 
215 - 04.08.04 - 17:53
(Варлок) Все идеи мои и не мои одновременно. Пришла мне в голову - значит моя. Но все в этом мире уже когда-то было, значит - не моя. :)
   Рупор абсурда
216 - 04.08.04 - 17:56
Тор, чё ты до парня домотался? ...
Ты тоже тут фигни достаточно наговорил ...
Отстань от него ..., а то я тебя самого счас с дерьмом мешать начну ...

Warlock, а ты не ведись ... как маленький ...
   Тор
 
217 - 04.08.04 - 17:58
(216) 1.Раз ведется, значит маленький. 2.Фигни и ты наговорил 3.Попробуй
   Warlock
 
218 - 04.08.04 - 18:01
(216)Да вот... Хотел конструктивной критики и ... "развелся"... Тор - негодяй!
   Рупор абсурда
219 - 04.08.04 - 18:04
(217) Ответь-ка мне для начала на один вопрос ...
Ты стал считать себя таким сильно умным после того, как понял (24) или раньше с тобой такое тоже бывало?
   Рупор абсурда
220 - 04.08.04 - 18:06
(218) Скажем так: Если ты не любишь конструктивную критику ..., это нормально ...
   Тор
 
221 - 04.08.04 - 18:12
(219) Руппи, я себя никогда не считал. Я твердо знаю что меня получится ровно 1 штука.
(218) Угу, в таком случае отвечу тебе - кг/ам
   Тор
 
222 - 04.08.04 - 18:18
+221. Правда, Варлок, ты все равно не поймешь, что я сказал... Ну и хорошо. Тебе спокойнее будет.
   Warlock
 
223 - 04.08.04 - 18:20
(222)Я пытался понять, но решил даже не спрашивать...
   NS
 
224 - 04.08.04 - 19:34
Это кто под моим ником деньги на кон ставит?
Так кто-нибудь мерял быстродействие?
   Guk
 
225 - 04.08.04 - 20:37
(224) Наверное Бекас.
Он знает все пароли, ко всем никам...
   NS
 
226 - 04.08.04 - 20:53
А вот и тест - параметры, как договаривались - первый 10000, второй 100...
Можно попробовать - первый 100000, второй 300...

перем случ;
Процедура Рандомизе()
    случ=_GetPerformanceCounter();
КонецПроцедуры                      
Функция Рандом(Интервал)   
    Случ=случ%1000000000000001;
    Случ=Случ*1103515245+12345;
    Возврат ((Случ/65536)%32768)%Интервал+1;
КонецФункции    
Процедура Сформировать()
    перем ТЗ,ТЗ_,КолстрокВТЗ,Разных;
    ввестичисло(колСтрокВТЗ,"Введите кол. строк в ТЗ",10,0);
    ввестичисло(Разных,"Введите количество разных значений",10,0);
    ТЗ=создатьОбъект("ТаблицаЗначений");
    ТЗ.Новаяколонка("Кол1","Число",10,0);
    ТЗ.НоваяКолонка("Кол2","Число",10,0);
    Рандомизе();
    Для а=1 по КолСтрокВТЗ цикл 
        Если а%100=0 Тогда
            состояние(а);
        КонецЕсли;    
        ТЗ.НоваяСтрока();
        ТЗ.Кол1=Рандом(Разных);
        ТЗ.Кол2=Рандом(Разных);
    КонецЦикла;                            
    Ищем1=Рандом(Разных);
    Ищем2=Рандом(Разных);
    начвремя=_GetperformanceCounter(); 
    стр=0; 
    ТЗ.ВыбратьСтроки(); 
    пока тЗ.ПолучитьСтроку()=1 цикл 
        если ТЗ.Кол1=Ищем1 тогда 
            если ТЗ.кол2=Ищем2 Тогда 
                стр=ТЗ.Номерстроки; 
                прервать; 
            конецесли; 
        конецесли; 
    КонецЦикла; 
    если стр=0 тогда 
        сообщить("не нашли"); 
    Иначе 
        сообщить(стр); 
    КонецЕсли; 
    конвремя=_GetperformanceCounter();
    сообщить("Простым перебором "+(конВремя-НачВремя)+" мс."); 
   // способ 2;

    начвремя=_GetperformanceCounter(); 
    стр=0;   
    _ТЗ=создатьобъект("ТаблицаЗначений");
    ТЗ.Выгрузить(_ТЗ,,,"Кол1");
    Пока _ТЗ.НайтиЗначение(Ищем1,Стр,"Кол1")>0 Цикл
        если ТЗ.ПолучитьЗначение(стр,"Кол2")=Ищем2 Тогда
            прервать;
        Иначе           
            _ТЗ.УстановитьЗначение(Стр,"Кол1",0);  
            стр=0;
        КонецЕсли;    
    КонецЦикла;        
    _ТЗ.Очистить();
    если стр=0 тогда 
        сообщить("не нашли"); 
    Иначе 
        сообщить(стр); 
    КонецЕсли; 
    конвремя=_GetperformanceCounter();
    сообщить("Метод 2: "+(конВремя-НачВремя)+" мс."); 
    
   // метод IAm  

    начвремя=_GetperformanceCounter(); 
    _ТЗ=создатьобъект("ТаблицаЗначений");
    ТЗ.Выгрузить(_ТЗ); 
    ИндексПоиска = 0; 
    Пока 1=1 Цикл   
        Если ИндексПоиска <> 1 Тогда 
            Поз1=0; 
            _ТЗ.НайтиЗначение(Ищем1,Поз1,"Кол1"); 
        КонецЕсли; 
        Если ИндексПоиска <> 2 Тогда 
            Поз2 =0; 
            _ТЗ.НайтиЗначение(Ищем2,Поз2,"Кол2");   
        КонецЕсли; 
        Если (Поз1=0) ИЛИ (Поз2=0) Тогда 
            прервать; 
        ИначеЕсли Поз1 = Поз2 Тогда 
            прервать; 
        ИначеЕсли Поз1 > Поз2 Тогда 
            _ТЗ.Заполнить("", 1, Поз1 - 1, "Кол2"); 
            ИндексПоиска = 1; 
        Иначе 
            _ТЗ.Заполнить("", 1, Поз2 - 1, "Кол1"); 
            ИндексПоиска = 2; 
        КонецЕсли; 
    КонецЦикла;   
    _ТЗ.Очистить();
    если (Поз1=0)или(поз2=0) тогда 
        сообщить("не нашли"); 
    Иначе 
        сообщить(стр); 
    КонецЕсли; 
    конвремя=_GetperformanceCounter();
    сообщить("Метод IAm: "+(конВремя-НачВремя)+" мс.");  
   // Если что не так - подправте модуль.

КонецПроцедуры
   NS
 
227 - 04.08.04 - 21:08
Кого интересуют результаты теста - перебор, как я и говорил - быстрее,
и чем больше строк в ТЗ, тем перебор сильнее выигрывает...
   Guk
 
228 - 04.08.04 - 21:27
(227) А я говорил, надо было на 500$ рубиться...
   NS
 
229 - 04.08.04 - 21:30
(228) Рискованно было...
Метод (13) Близок по скорости (на маленьком количестве элементов - до тысячи - даже быстрее, но при больших медленней... (при 100000, более, чем в два раза))
ЗЫ. Я писал метод 2 - не видя 13-го поста.... как-то я этот пост упустил.
   Z1
 
230 - 04.08.04 - 21:39
(229) Твои псевдослучайные числа у меня дают сплошной 0.
Мой тест
//*******************************************

Функция Ранд(Парам=0)
    Если Парам<>0 Тогда
        Случай=Парам;
    КонецЕсли;
    Если Число(Случай)=0 Тогда
        Случай=Число(СтрЗаменить(""+ТекущееВремя(),":",""));
        Случай=(16807*Случай)%2147483647;
    КонецЕсли;
    Случай=(16807*Случай)%2147483647;
    Случай=макс(Случай,-Случай);
    Возврат(Случай/2147483647);
КонецФункции

Функция ВычислитьДельта(Мин1, Макс1)
    Зн1 = Макс1 - Мин1 + 1;
    Ч1 = Ранд();
    Ч2 = Ч1 * Зн1;
    Ч3 = Мин1 + Цел( Ч2 );
    return Ч3;
КонецФункции

Функция ПоискОдиночныйПоДвумКолонкам(ТЗ,Значение1,Значение2,Колонка1,Колонка2) 
    Перем ТЗ_;
   //Если ПустоеЗначение(Значение1)=1 Тогда Возврат("Глюк1 :)") КонецЕсли; 

   //Если ПустоеЗначение(Значение2)=1 Тогда Возврат("Глюк2 :)") КонецЕсли; 

    Ном1=0; 
    ТЗ.НайтиЗначение(Значение1,Ном1,Колонка1); 
    Если Ном1=0 Тогда Возврат(0) КонецЕсли;
    Ном2=0; 
    ТЗ.НайтиЗначение(Значение2,Ном2,Колонка2); 
    Если Ном2=0 Тогда Возврат(0) КонецЕсли;
    Если Ном1 = Ном2 Тогда 
        Возврат(Ном1);
    ИначеЕсли Ном1 > Ном2 Тогда
        Зн2 = ТЗ.ПолучитьЗначение(Ном1,Колонка2);
        Если Зн2 = Значение2 Тогда
            Возврат(Ном1);
        КонецЕсли;
        Ном3 = Ном1 + 1;
    Иначе
        Зн1 = ТЗ.ПолучитьЗначение(Ном2,Колонка1);
        Если Зн1 = Значение1 Тогда
            Возврат(Ном2);
        КонецЕсли;
        Ном3 = Ном2 + 1;
    КонецЕсли;
    Дельта = Ном3;
    СписокКолонок = Колонка1 + "," + Колонка2;
    ТЗ.Выгрузить(ТЗ_,Ном3, ,СписокКолонок );
    Если ТЗ_.КоличествоСтрок() <= 0 Тогда Возврат(0) КонецЕсли;
    Пока 1=1 Цикл 
        Ном1=0; 
        ТЗ_.НайтиЗначение(Значение1,Ном1,Колонка1); 
        Если Ном1=0 Тогда Возврат(0) КонецЕсли;
        Ном2=0; 
        ТЗ_.НайтиЗначение(Значение2,Ном2,Колонка2); 
        Если Ном2=0 Тогда Возврат(0) КонецЕсли;
        Если Ном1 = Ном2 Тогда 
            Возврат(Дельта + Ном1);
        ИначеЕсли Ном1 > Ном2 Тогда
            Зн2 = ТЗ_.ПолучитьЗначение(Ном1,Колонка2);
            Если Зн2 = Значение2 Тогда
                Возврат(Дельта + Ном1);
            КонецЕсли;
            Ном3 = Ном1 + 1;
        Иначе
            Зн1 = ТЗ_.ПолучитьЗначение(Ном2,Колонка1);
            Если Зн1 = Значение1 Тогда
                Возврат(Дельта + Ном2);
            КонецЕсли;
            Ном3 = Ном2 + 1;
        КонецЕсли;
        Дельта = Дельта + Ном3;
        ТЗ_.Выгрузить(ТЗ_,Ном3, , );
        Если ТЗ_.КоличествоСтрок() <= 0 Тогда Возврат(0) КонецЕсли;
    КонецЦикла; 
КонецФункции 

Процедура Рандомизе() 
   случ=_GetPerformanceCounter(); 
КонецПроцедуры                       
Функция Рандом(Интервал)   
   Случ=случ%1000000000000001; 
   Случ=Случ*1103515245+12345; 
    Ч1 = ((Случ/65536)%32768)%Интервал+1; 
    Ч2 = Цел(Ч1);
    Сообщить("Ч2 = " + Ч2);
   Возврат Ч2;
КонецФункции     
Процедура Сформировать() 
   перем ТЗ,ТЗ_,КолстрокВТЗ,Разных; 
  //ввестичисло(колСтрокВТЗ,"Введите кол. строк в ТЗ",10,0); 

  //ввестичисло(Разных,"Введите количество разных значений",10,0); 

   колСтрокВТЗ = 10000;
   Разных = 100;
   ТЗ=создатьОбъект("ТаблицаЗначений"); 
   ТЗ.Новаяколонка("Кол1","Число",10,0); 
   ТЗ.НоваяКолонка("Кол2","Число",10,0); 
   Рандомизе(); 
   Для а=1 по КолСтрокВТЗ цикл 
       Если а%100=0 Тогда 
           состояние(а); 
       КонецЕсли;     
       ТЗ.НоваяСтрока(); 
       ТЗ.Кол1= ВычислитьДельта(0, Разных);
       ТЗ.Кол2=ВычислитьДельта(0, Разных); 
   КонецЦикла;                             
   Ищем1= ВычислитьДельта(0, Разных);
   Ищем2=ВычислитьДельта(0, Разных);
   Сообщить("Ищем = " + Ищем1 + " " + Ищем2);
   начвремя=_GetperformanceCounter(); 
   стр=0; 
   ТЗ.ВыбратьСтроки(); 
   пока тЗ.ПолучитьСтроку()=1 цикл 
       если ТЗ.Кол1=Ищем1 тогда 
           если ТЗ.кол2=Ищем2 Тогда 
               стр=ТЗ.Номерстроки; 
               прервать; 
           конецесли; 
       конецесли; 
   КонецЦикла; 
   если стр=0 тогда 
       сообщить("не нашли"); 
   Иначе 
       сообщить(стр); 
   КонецЕсли; 
   конвремя=_GetperformanceCounter(); 
   сообщить("Простым перебором "+(конВремя-НачВремя)+" мс."); 
  // способ 2; 

   начвремя=_GetperformanceCounter(); 
   стр=0;   
   _ТЗ=создатьобъект("ТаблицаЗначений"); 
   ТЗ.Выгрузить(_ТЗ,,,"Кол1"); 
   Пока _ТЗ.НайтиЗначение(Ищем1,Стр,"Кол1")>0 Цикл 
       если ТЗ.ПолучитьЗначение(стр,"Кол2")=Ищем2 Тогда 
           прервать; 
       Иначе           
           _ТЗ.УстановитьЗначение(Стр,"Кол1",0);   
           стр=0; 
       КонецЕсли;     
   КонецЦикла;         
   _ТЗ.Очистить(); 
   если стр=0 тогда 
       сообщить("не нашли"); 
   Иначе 
       сообщить(стр); 
   КонецЕсли; 
   конвремя=_GetperformanceCounter(); 
   сообщить("Метод 2: "+(конВремя-НачВремя)+" мс."); 
    
  // метод IAm   

   начвремя=_GetperformanceCounter(); 
   _ТЗ=создатьобъект("ТаблицаЗначений"); 
   ТЗ.Выгрузить(_ТЗ); 
   ИндексПоиска = 0; 
   Пока 1=1 Цикл   
       Если ИндексПоиска <> 1 Тогда 
           Поз1=0; 
           _ТЗ.НайтиЗначение(Ищем1,Поз1,"Кол1"); 
       КонецЕсли; 
       Если ИндексПоиска <> 2 Тогда 
           Поз2 =0; 
           _ТЗ.НайтиЗначение(Ищем2,Поз2,"Кол2");   
       КонецЕсли; 
       Если (Поз1=0) ИЛИ (Поз2=0) Тогда 
           прервать; 
       ИначеЕсли Поз1 = Поз2 Тогда 
           прервать; 
       ИначеЕсли Поз1 > Поз2 Тогда 
           _ТЗ.Заполнить("", 1, Поз1 - 1, "Кол2"); 
           ИндексПоиска = 1; 
       Иначе 
           _ТЗ.Заполнить("", 1, Поз2 - 1, "Кол1"); 
           ИндексПоиска = 2; 
       КонецЕсли; 
   КонецЦикла;   
   _ТЗ.Очистить(); 
   если (Поз1=0)или(поз2=0) тогда 
       сообщить("не нашли"); 
   Иначе 
       сообщить(стр); 
   КонецЕсли; 
   конвремя=_GetperformanceCounter(); 
   сообщить("Метод IAm: "+(конВремя-НачВремя)+" мс.");   
  // Если что не так - подправте модуль.

   начвремя=_GetperformanceCounter(); 
    Зн1 = ПоискОдиночныйПоДвумКолонкам(ТЗ,Ищем1,Ищем2,"Кол1","Кол2");
   конвремя=_GetperformanceCounter(); 
   Сообщить("Зн1 = " + Зн1);
   сообщить("Метод Z1 (143) "+(конВремя-НачВремя)+" мс.");
   Сообщить(" ");
КонецПроцедуры 

Результат теста
Ищем = 97 97
7604
Простым перебором 163 мс.
7604
Метод 2: 131 мс.
7604
Метод IAm: 248 мс.
Зн1 = 7604
Метод Z1 (143) 4 мс.

Ищем = 89 89
6706
Простым перебором 147 мс.
6706
Метод 2: 128 мс.
6706
Метод IAm: 252 мс.
Зн1 = 6706
Метод Z1 (143) 3 мс.

Ищем = 33 33
6483
Простым перебором 140 мс.
6483
Метод 2: 128 мс.
6483
Метод IAm: 251 мс.
Зн1 = 6483
Метод Z1 (143) 3 мс.
   NS
 
231 - 04.08.04 - 21:46
Да уж...
Почему у тебя ищем1 всегда равно ищем2? ;-)
Ты просто с генератором накосячил...
Сделай ТЗ.ВыбратьСтроку();
   Z1
 
232 - 04.08.04 - 21:52
(231) Не спорю может и накосячил. Твой генератор дает у меня на компьютере сплошные нули.
Предложи другой генератор лучше из какой нибудь ВК. после сравним.
Все до завтра - поеду я домой.
   NS
 
233 - 04.08.04 - 21:56
(232) Не может, а точно....
Мой нули не выдает...
 
  Рекламное место пустует
   NS
 
234 - 04.08.04 - 22:07
перем случ;
Функция ПоискОдиночныйПоДвумКолонкам(ТЗ,Значение1,Значение2,Колонка1,Колонка2) 
    Перем ТЗ_; 
   //Если ПустоеЗначение(Значение1)=1 Тогда Возврат("Глюк1 :)") КонецЕсли; 

   //Если ПустоеЗначение(Значение2)=1 Тогда Возврат("Глюк2 :)") КонецЕсли; 

    Ном1=0; 
    ТЗ.НайтиЗначение(Значение1,Ном1,Колонка1); 
    Если Ном1=0 Тогда Возврат(0) КонецЕсли; 
    Ном2=0; 
    ТЗ.НайтиЗначение(Значение2,Ном2,Колонка2); 
    Если Ном2=0 Тогда Возврат(0) КонецЕсли; 
    Если Ном1 = Ном2 Тогда 
        Возврат(Ном1); 
    ИначеЕсли Ном1 > Ном2 Тогда 
        Зн2 = ТЗ.ПолучитьЗначение(Ном1,Колонка2); 
        Если Зн2 = Значение2 Тогда 
            Возврат(Ном1); 
        КонецЕсли; 
        Ном3 = Ном1 + 1; 
    Иначе 
        Зн1 = ТЗ.ПолучитьЗначение(Ном2,Колонка1); 
        Если Зн1 = Значение1 Тогда 
            Возврат(Ном2); 
        КонецЕсли; 
        Ном3 = Ном2 + 1; 
    КонецЕсли; 
    Дельта = Ном3; 
    СписокКолонок = Колонка1 + "," + Колонка2; 
    ТЗ.Выгрузить(ТЗ_,Ном3, ,СписокКолонок ); 
    Если ТЗ_.КоличествоСтрок() <= 0 Тогда Возврат(0) КонецЕсли; 
    Пока 1=1 Цикл 
        Ном1=0; 
        ТЗ_.НайтиЗначение(Значение1,Ном1,Колонка1); 
        Если Ном1=0 Тогда Возврат(0) КонецЕсли; 
        Ном2=0; 
        ТЗ_.НайтиЗначение(Значение2,Ном2,Колонка2); 
        Если Ном2=0 Тогда Возврат(0) КонецЕсли; 
        Если Ном1 = Ном2 Тогда 
            Возврат(Дельта + Ном1); 
        ИначеЕсли Ном1 > Ном2 Тогда 
            Зн2 = ТЗ_.ПолучитьЗначение(Ном1,Колонка2); 
            Если Зн2 = Значение2 Тогда 
                Возврат(Дельта + Ном1); 
            КонецЕсли; 
            Ном3 = Ном1 + 1; 
        Иначе 
            Зн1 = ТЗ_.ПолучитьЗначение(Ном2,Колонка1); 
            Если Зн1 = Значение1 Тогда 
                Возврат(Дельта + Ном2); 
            КонецЕсли; 
            Ном3 = Ном2 + 1; 
        КонецЕсли; 
        Дельта = Дельта + Ном3; 
        ТЗ_.Выгрузить(ТЗ_,Ном3, , ); 
        Если ТЗ_.КоличествоСтрок() <= 0 Тогда Возврат(0) КонецЕсли; 
    КонецЦикла; 
КонецФункции 

Процедура Рандомизе()
    случ=_GetPerformanceCounter();
КонецПроцедуры                      
Функция Рандом(Интервал)   
    Случ=случ%1000000000000001;
    Случ=Случ*1103515245+12345;
    Возврат ((Случ/65536)%32768)%Интервал+1;
КонецФункции    
Процедура Сформировать()
    перем ТЗ,ТЗ_,КолстрокВТЗ,Разных;
    ввестичисло(колСтрокВТЗ,"Введите кол. строк в ТЗ",10,0);
    ввестичисло(Разных,"Введите количество разных значений",10,0);
    ТЗ=создатьОбъект("ТаблицаЗначений");
    ТЗ.Новаяколонка("Кол1","Число",10,0);
    ТЗ.НоваяКолонка("Кол2","Число",10,0);
    Рандомизе();
    Для а=1 по КолСтрокВТЗ цикл 
        Если а%100=0 Тогда
            состояние(а);
        КонецЕсли;    
        ТЗ.НоваяСтрока();
        ТЗ.Кол1=Рандом(Разных);
        ТЗ.Кол2=Рандом(Разных);
    КонецЦикла;  
    Тз.ВыбратьСтроку();
    Ищем1=Рандом(Разных);
    Ищем2=Рандом(Разных);
    сообщить("Ищем: "+Ищем1+" "+Ищем2);
    начвремя=_GetperformanceCounter(); 
    стр=0; 
    ТЗ.ВыбратьСтроки(); 
    пока тЗ.ПолучитьСтроку()=1 цикл 
        если ТЗ.Кол1=Ищем1 тогда 
            если ТЗ.кол2=Ищем2 Тогда 
                стр=ТЗ.Номерстроки; 
                прервать; 
            конецесли; 
        конецесли; 
    КонецЦикла; 
    если стр=0 тогда 
        сообщить("не нашли"); 
    Иначе 
        сообщить(стр); 
    КонецЕсли; 
    конвремя=_GetperformanceCounter();
    сообщить("Простым перебором "+(конВремя-НачВремя)+" мс."); 
   // способ 2;

    начвремя=_GetperformanceCounter(); 
    стр=0;   
    _ТЗ=создатьобъект("ТаблицаЗначений");
    ТЗ.Выгрузить(_ТЗ,,,"Кол1");
    Пока _ТЗ.НайтиЗначение(Ищем1,Стр,"Кол1")>0 Цикл
        если ТЗ.ПолучитьЗначение(стр,"Кол2")=Ищем2 Тогда
            прервать;
        Иначе           
            _ТЗ.УстановитьЗначение(Стр,"Кол1",0);  
            стр=0;
        КонецЕсли;    
    КонецЦикла;        
    _ТЗ.Очистить();
    если стр=0 тогда 
        сообщить("не нашли"); 
    Иначе 
        сообщить(стр); 
    КонецЕсли; 
    конвремя=_GetperformanceCounter();
    сообщить("Метод 2: "+(конВремя-НачВремя)+" мс."); 
    
   // метод IAm  

    начвремя=_GetperformanceCounter(); 
    _ТЗ=создатьобъект("ТаблицаЗначений");
    ТЗ.Выгрузить(_ТЗ); 
    ИндексПоиска = 0; 
    Пока 1=1 Цикл   
        Если ИндексПоиска <> 1 Тогда 
            Поз1=0; 
            _ТЗ.НайтиЗначение(Ищем1,Поз1,"Кол1"); 
        КонецЕсли; 
        Если ИндексПоиска <> 2 Тогда 
            Поз2 =0; 
            _ТЗ.НайтиЗначение(Ищем2,Поз2,"Кол2");   
        КонецЕсли; 
        Если (Поз1=0) ИЛИ (Поз2=0) Тогда 
            прервать; 
        ИначеЕсли Поз1 = Поз2 Тогда 
            прервать; 
        ИначеЕсли Поз1 > Поз2 Тогда 
            _ТЗ.Заполнить("", 1, Поз1 - 1, "Кол2"); 
            ИндексПоиска = 1; 
        Иначе 
            _ТЗ.Заполнить("", 1, Поз2 - 1, "Кол1"); 
            ИндексПоиска = 2; 
        КонецЕсли; 
    КонецЦикла;   
    _ТЗ.Очистить();
    если (Поз1=0)или(поз2=0) тогда 
        сообщить("не нашли"); 
    Иначе 
        сообщить(стр); 
    КонецЕсли; 
    конвремя=_GetperformanceCounter();
    сообщить("Метод IAm: "+(конВремя-НачВремя)+" мс."); 
   //Метод Z1

    начвремя=_GetperformanceCounter(); 
    Зн1 = ПоискОдиночныйПоДвумКолонкам(ТЗ,Ищем1,Ищем2,"Кол1","Кол2"); 
    конвремя=_GetperformanceCounter(); 
    Сообщить("Зн1 = " + Зн1); 
    сообщить("Метод Z1 (143) "+(конВремя-НачВремя)+" мс."); 
    Сообщить(" "); 
    
   // Если что не так - подправте модуль.

КонецПроцедуры
...
Добавил метод Z1, и проверку генератора (ТЗ выводит)
   GrayT
 
235 - 04.08.04 - 22:11
Зачем выгрузку в промежуточную ТЗ и очистку таблицы внутри замера времени делаете?
   NS
 
236 - 04.08.04 - 22:16
Все тесты - 10000,100
Мало того, что метод Z1 тормозит жутко - еще и результат неправильный ;-)
(и есно генератор в (230) неправильно работает - ТЗ кривая)

Ищем: 13 8
4477
Простым перебором 781 мс.
4477
Метод 2: 1517 мс.
4477
Метод IAm: 4002 мс.
Зн1 = 4505
Метод Z1 (143) 72650 мс.

Ищем: 20 1
не нашли
Простым перебором 1596 мс.
не нашли
Метод 2: 2417 мс.
не нашли
Метод IAm: 17113 мс.
Зн1 = 0
Метод Z1 (143) 112295 мс.

Ищем: 84 76
795
Простым перебором 142 мс.
795
Метод 2: 904 мс.
795
Метод IAm: 1645 мс.
Зн1 = 800
Метод Z1 (143) 10821 мс.

Ищем: 52 98
7540
Простым перебором 1008 мс.
7540
Метод 2: 1606 мс.
7540
Метод IAm: 11298 мс.
Зн1 = 7596
Метод Z1 (143) 95587 мс.
   NS
 
237 - 04.08.04 - 22:19
(235) А в рабочей программе - алгоритмами (2) и (IAm) - делать не надо?
А память - кто подчищать будет?
Алгоритм Z1 ес-но исключаю, как сошедший с дистанции...
   NS
 
238 - 04.08.04 - 22:20
(+237) Выгрузку делать не надо?
   Рупор абсурда
239 - 04.08.04 - 22:21
(237) Я не понял ..., ты остался один на дистанции? ...
   Рупор абсурда
240 - 04.08.04 - 22:23
Кстати, нули, про которые Z1 говорил, вероятно оттого у него были, что переменная Случ на уровне модуля не объявлена была ...
   NS
 
241 - 04.08.04 - 22:24
перем случ;

Процедура Рандомизе()
    случ=_GetPerformanceCounter();
КонецПроцедуры                      
Функция Рандом(Интервал)   
    Случ=случ%1000000000000001;
    Случ=Случ*1103515245+12345;
    Возврат ((Случ/65536)%32768)%Интервал+1;
КонецФункции    
Процедура Сформировать()
    перем ТЗ,ТЗ_,КолстрокВТЗ,Разных;
    ввестичисло(колСтрокВТЗ,"Введите кол. строк в ТЗ",10,0);
    ввестичисло(Разных,"Введите количество разных значений",10,0);
    ТЗ=создатьОбъект("ТаблицаЗначений");
    ТЗ.Новаяколонка("Кол1","Число",10,0);
    ТЗ.НоваяКолонка("Кол2","Число",10,0);
    Рандомизе();
    Для а=1 по КолСтрокВТЗ цикл 
        Если а%100=0 Тогда
            состояние(а);
        КонецЕсли;    
        ТЗ.НоваяСтрока();
        ТЗ.Кол1=Рандом(Разных);
        ТЗ.Кол2=Рандом(Разных);
    КонецЦикла;  
    Тз.ВыбратьСтроку();
    Ищем1=Рандом(Разных);
    Ищем2=Рандом(Разных);
    сообщить("Ищем: "+Ищем1+" "+Ищем2);
    начвремя=_GetperformanceCounter(); 
    стр=0; 
    ТЗ.ВыбратьСтроки(); 
    пока тЗ.ПолучитьСтроку()=1 цикл 
        если ТЗ.Кол1=Ищем1 тогда 
            если ТЗ.кол2=Ищем2 Тогда 
                стр=ТЗ.Номерстроки; 
                прервать; 
            конецесли; 
        конецесли; 
    КонецЦикла; 
    если стр=0 тогда 
        сообщить("не нашли"); 
    Иначе 
        сообщить(стр); 
    КонецЕсли; 
    конвремя=_GetperformanceCounter();
    сообщить("Простым перебором "+(конВремя-НачВремя)+" мс."); 
   // способ 2; 

    начвремя=_GetperformanceCounter(); 
    стр=0;   
    _ТЗ=создатьобъект("ТаблицаЗначений");
    ТЗ.Выгрузить(_ТЗ,,,"Кол1"); 
    Пока _ТЗ.НайтиЗначение(Ищем1,Стр,"Кол1")>0 Цикл
        если ТЗ.ПолучитьЗначение(стр,"Кол2")=Ищем2 Тогда
            прервать;
        Иначе           
            _ТЗ.УстановитьЗначение(Стр,"Кол1",0);  
            стр=0;
        КонецЕсли;    
    КонецЦикла;        
    если стр=0 тогда 
        сообщить("не нашли"); 
    Иначе 
        сообщить(стр); 
    КонецЕсли; 
    конвремя=_GetperformanceCounter();
    сообщить("Метод 2: "+(конВремя-НачВремя)+" мс."); 
    _ТЗ.Очистить();
   // Если что не так - подправте модуль.

КонецПроцедуры

////////////


Ищем: 87 84
не нашли
Простым перебором 1171 мс.
не нашли
Метод 2: 1695 мс.
Ищем: 23 98
5995
Простым перебором 1030 мс.
5995
Метод 2: 1803 мс.
Ищем: 15 73
не нашли
Простым перебором 1170 мс.
не нашли
Метод 2: 1813 мс.
   NS
 
242 - 04.08.04 - 22:25
(239) Второй метод был предложен тобой в 13-том посте.
   NS
 
243 - 04.08.04 - 22:29
100000,300

Ищем: 45 219
50263
Простым перебором 7538 мс.
50263
Метод 2: 25402 мс.
   Рупор абсурда
244 - 04.08.04 - 22:31
Вывод:
Не фиг бояться перебора и называть его тупым! ...
   GrayT
 
245 - 04.08.04 - 22:32
Я не против замеров перегрузок и зачисток, но первый и последний методы их не имеют. Метдод Z1 модификацией IAm-овкого метода (просто отрезает ненужное вместо переприсвоения) - он не может сильно отличаться.
И вот еще что метод IAm'а переодически клинит на порядок, а Zl нет
   NS
 
246 - 04.08.04 - 22:37
(245) Еще раз посмотри результаты и время...
метод z1 - выдает неправильный результат, и медленнее первого - на пару порядков!!!
Подчиску ТЗ я вынес за расчет времени...
В первом методе - просто нет выгрузки - поэтому ес-но и не входит в замер - второй и т.д. - без выгрузки работать не могут (портят ТЗ)
В методе Z1 - выгрузка входит в замер...
   NS
 
247 - 05.08.04 - 00:58
(232) А чем генератор из ВК лучше???
   Z1
 
248 - 05.08.04 - 10:24
(247) Ошибку у себя нашел.
надо     Дельта = Ном3 - 1;
и    Дельта = Дельта + Ном3 - 1;
тогда все результаты одинаковые.
но все равно у меня тормозит сильно.
99 % времени занимает  Выгрузить для ТЗ съедая все время.
Iam быстрее моего потому что у него только одна Выгрузить для ТЗ
   Рупор абсурда
249 - 05.08.04 - 12:13
Вот вам ещё вариант ..., в среднем работает быстрее перебора ..., даже самого тупого перебора ...

  // способ Рупора; 

   начвремя=_GetperformanceCounter(); 
   СЗ=СоздатьОбъект("СписокЗначений");
   стр=0;         
   Пока ТЗ.НайтиЗначение(Ищем1,Стр,"Кол1")>0 Цикл 
       если ТЗ.ПолучитьЗначение(стр,"Кол2")=Ищем2 Тогда 
           прервать; 
       Иначе           
           СЗ.ДобавитьЗначение(ТЗ.ПолучитьЗначение(стр,"Кол1"));
           ТЗ.УстановитьЗначение(Стр,"Кол1",0);   
           стр=0; 
       КонецЕсли;     
   КонецЦикла;         
   если стр=0 тогда 
       сообщить("не нашли"); 
   Иначе 
       сообщить(стр); 
       Для стр=1 По СЗ.РазмерСписка() Цикл
           ТЗ.УстановитьЗначение(СЗ.ПолучитьЗначение(стр),"Кол1",Ищем1);
       КонецЦикла;    
   КонецЕсли; 
   конвремя=_GetperformanceCounter(); 
   сообщить("Метод Рупора: "+(конВремя-НачВремя)+" мс.");
 
  Рекламное место пустует
   NS
 
250 - 05.08.04 - 12:17
Протестируй на 100000,300...
Хотя должен быть быстрее...
сложность Корень*Логарифм.
   Рупор абсурда
251 - 05.08.04 - 12:19
(250) Перебор иногда оказывается быстрее в случае когда "не нашли" ...
... Но редко ... :))
   Волшебник
 
252 - 05.08.04 - 12:37
тест
   Рупор абсурда
253 - 05.08.04 - 12:40
(249) Там ещё и ошибочка ..., внимательный GrayT указал ...
Надо так:

// способ Рупора; 

 начвремя=_GetperformanceCounter(); 
 СЗ=СоздатьОбъект("СписокЗначений"); 
 стр=0;         
 Пока ТЗ.НайтиЗначение(Ищем1,Стр,"Кол1")>0 Цикл 
     если ТЗ.ПолучитьЗначение(стр,"Кол2")=Ищем2 Тогда 
         прервать; 
     Иначе           
         СЗ.ДобавитьЗначение(стр);// <------- тут ошибка была !!!! 

         ТЗ.УстановитьЗначение(Стр,"Кол1",0);   
         стр=0; 
     КонецЕсли;     
 КонецЦикла;         
 если стр=0 тогда 
     сообщить("не нашли"); 
 Иначе 
     сообщить(стр); 
     Для стр=1 По СЗ.РазмерСписка() Цикл 
         ТЗ.УстановитьЗначение(СЗ.ПолучитьЗначение(стр),"Кол1",Ищем1); 
     КонецЦикла;     
 КонецЕсли; 
 конвремя=_GetperformanceCounter(); 
 сообщить("Метод Рупора: "+(конВремя-НачВремя)+" мс."); 

Т.е. должно работать ещё быстрее ...
   Рупор абсурда
254 - 05.08.04 - 12:42
NS, кстати, в асю я к тебе, как и обещал, стукнулся ... :))
   NS
 
255 - 05.08.04 - 12:42
Процедура Рандомизе() 
   случ=_GetPerformanceCounter(); 
КонецПроцедуры                       
Функция Рандом(Интервал)   
   Случ=случ%1000000000000001; 
   Случ=Случ*1103515245+12345; 
   Возврат ((Случ/65536)%32768)%Интервал+1; 
КонецФункции     
Процедура Сформировать() 
   перем ТЗ,ТЗ_,КолстрокВТЗ,Разных1,Разных2; 
   ввестичисло(колСтрокВТЗ,"Введите кол. строк в ТЗ",10,0); 
   ввестичисло(Разных1,"Введите количество разных значений",10,0); 
   ввестичисло(Разных2,"Введите количество разных значений",10,0);     
   ТЗ=создатьОбъект("ТаблицаЗначений"); 
   ТЗ.Новаяколонка("Кол1","Число",10,0); 
   ТЗ.НоваяКолонка("Кол2","Число",10,0); 
   Рандомизе(); 
   Для а=1 по КолСтрокВТЗ цикл 
       Если а%100=0 Тогда 
           состояние(а); 
       КонецЕсли;     
       ТЗ.НоваяСтрока(); 
       ТЗ.Кол1=Рандом(Разных1); 
       ТЗ.Кол2=Рандом(Разных2); 
   КонецЦикла;   
   Тз.ВыбратьСтроку(); 
   Ищем1=Рандом(Разных1); 
   Ищем2=Рандом(Разных2); 
   сообщить("Ищем: "+Ищем1+" "+Ищем2); 
   начвремя=_GetperformanceCounter(); 
   стр=0; 
   ТЗ.ВыбратьСтроки(); 
   пока тЗ.ПолучитьСтроку()=1 цикл 
       если ТЗ.Кол1=Ищем1 тогда 
           если ТЗ.кол2=Ищем2 Тогда 
               стр=ТЗ.Номерстроки; 
               прервать; 
           конецесли; 
       конецесли; 
   КонецЦикла; 
   если стр=0 тогда 
       сообщить("не нашли"); 
   Иначе 
       сообщить(стр); 
   КонецЕсли; 
   конвремя=_GetperformanceCounter(); 
   сообщить("Простым перебором "+(конВремя-НачВремя)+" мс."); 
  // способ 2; 

   начвремя=_GetperformanceCounter(); 
   стр=0;   
   _ТЗ=создатьобъект("ТаблицаЗначений"); 
   ТЗ.Выгрузить(_ТЗ,,,"Кол1"); 
   Пока _ТЗ.НайтиЗначение(Ищем1,Стр,"Кол1")>0 Цикл 
       если ТЗ.ПолучитьЗначение(стр,"Кол2")=Ищем2 Тогда 
           прервать; 
       Иначе           
           _ТЗ.УстановитьЗначение(Стр,"Кол1",0);   
           стр=0; 
       КонецЕсли;     
   КонецЦикла;         
   если стр=0 тогда 
       сообщить("не нашли"); 
   Иначе 
       сообщить(стр); 
   КонецЕсли; 
   конвремя=_GetperformanceCounter(); 
   сообщить("Метод 2: "+(конВремя-НачВремя)+" мс."); 
   _ТЗ.Очистить();   
   начвремя=_GetperformanceCounter(); 
 СЗ=СоздатьОбъект("СписокЗначений"); 
 стр=0;         
 Пока ТЗ.НайтиЗначение(Ищем1,Стр,"Кол1")>0 Цикл 
     если ТЗ.ПолучитьЗначение(стр,"Кол2")=Ищем2 Тогда 
         прервать; 
     Иначе           
         СЗ.ДобавитьЗначение(стр); 
         ТЗ.УстановитьЗначение(Стр,"Кол1",0);   
         стр=0; 
     КонецЕсли;     
 КонецЦикла;         
 если стр=0 тогда 
     сообщить("не нашли"); 
 Иначе 
     сообщить(стр); 
     Для стр=1 По СЗ.РазмерСписка() Цикл 
         ТЗ.УстановитьЗначение(СЗ.ПолучитьЗначение(стр),"Кол1",Ищем1); 
     КонецЦикла;     
 КонецЕсли; 
 конвремя=_GetperformanceCounter(); 
 сообщить("Метод Рупора: "+(конВремя-НачВремя)+" мс."); 
  // Если что не так - подправте модуль. 

КонецПроцедуры 
///// 

Тест 10000,10,1000. 
//// 

Ищем: 10 502 
9909
Простым перебором 1220 мс.
9909
Метод 2: 12951 мс.
9909
Метод Рупора: 17829 мс.
//////
перебор стабильней.
   Рупор абсурда
256 - 05.08.04 - 13:06
Серия тестов на 100 000 и 300 ...

Ищем: 211 71
4585
Простым перебором 177 мс.
4585
Метод 2: 2148 мс.
4585
Метод Рупора: 71 мс.


Ищем: 231 248
26687
Простым перебором 1858 мс.
26687
Метод 2: 3399 мс.
26687
Метод Рупора: 1377 мс.

Ищем: 261 59
1508
Простым перебором 115 мс.
1508
Метод 2: 2131 мс.
1508
Метод Рупора: 19 мс.
   Z1
 
257 - 05.08.04 - 13:08
Этот метод если нет значения всегда быстрее чем линейный поиск.
Когда значение есть когда как.
Получается слишком медлено 1с работает со своими объектами СписокЗначений и ТаблицаЗначений. Может турбоускоритель  Orefkov включить ?
Хотя это протеворечит (189)

Функция ПоискОдиночныйПоДвумКолонкамсписок1(ТЗ,Значение1,Значение2,Колонка1,Колонка2) 
   //Если ПустоеЗначение(Значение1)=1 Тогда Возврат("Глюк1 :)") КонецЕсли; 

   //Если ПустоеЗначение(Значение2)=1 Тогда Возврат("Глюк2 :)") КонецЕсли; 

    Ном1=0; 
    ТЗ.НайтиЗначение(Значение1,Ном1,Колонка1); 
    Если Ном1=0 Тогда Возврат(0) КонецЕсли;
    Ном2=0; 
    ТЗ.НайтиЗначение(Значение2,Ном2,Колонка2); 
    Если Ном2=0 Тогда Возврат(0) КонецЕсли;
    Если Ном1 = Ном2 Тогда 
        Возврат(Ном1);
    ИначеЕсли Ном1 > Ном2 Тогда
        Зн2 = ТЗ.ПолучитьЗначение(Ном1,Колонка2);
        Если Зн2 = Значение2 Тогда
            Возврат(Ном1);
        КонецЕсли;
        Ном3 = Ном1 + 1;
    Иначе
        Зн1 = ТЗ.ПолучитьЗначение(Ном2,Колонка1);
        Если Зн1 = Значение1 Тогда
            Возврат(Ном2);
        КонецЕсли;
        Ном3 = Ном2 + 1;
    КонецЕсли;
    Дельта = Ном3 - 1;
//Сообщить("Ном3 = " + Ном3);

   //СписокКолонок = Колонка1 + "," + Колонка2;

   //ТЗ.Выгрузить(ТЗ_,Ном3,  ,СписокКолонок );


    Список1 = СоздатьОбъект("СписокЗначений");
    Список2 = СоздатьОбъект("СписокЗначений");
    ТЗ.Выгрузить(Список1,Ном3,  , Колонка1);
    ТЗ.Выгрузить(Список2,Ном3,  , Колонка2);
    Пока 1=1 Цикл 
        Ном1 = Список1.НайтиЗначение(Значение1); 
        Если Ном1=0 Тогда Возврат(0) КонецЕсли;
        Ном2 = Список2.НайтиЗначение(Значение2); 
        Если Ном2=0 Тогда Возврат(0) КонецЕсли;
        Если Ном1 = Ном2 Тогда 
            Возврат(Дельта + Ном1);
        ИначеЕсли Ном1 > Ном2 Тогда
           //Зн2 = Список2.ПолучитьЗначение(Ном1,);

           //Если Зн2 = Значение2 Тогда

           //    Возврат(Дельта + Ном1);

           //КонецЕсли;

           //Ном3 = Ном1;

            Ном3 = Ном1 - 1;
        Иначе
           //Зн1 = Список1.ПолучитьЗначение(Ном2,);

           //Если Зн1 = Значение1 Тогда

           //    Возврат(Дельта + Ном2);

           //КонецЕсли;

           //Ном3 = Ном2;

            Ном3 = Ном2 - 1;
        КонецЕсли;
//Сообщить("Ном3 = " + Ном3);

        Дельта = Дельта + Ном3;
        Список1.УдалитьЗНачение(1,Ном3);
        Список2.УдалитьЗНачение(1,Ном3);

       //Если ТЗ_.КоличествоСтрок() <= 0 Тогда Возврат(0) КонецЕсли;

    КонецЦикла; 
КонецФункции
   Рупор абсурда
258 - 05.08.04 - 13:08
(255) Я ничего не нашаманил ..., просто скопировал код (255) ...
Скажи честно, ты фальсифицировал результаты? ...
   Рупор абсурда
259 - 05.08.04 - 13:12
Вот ещё для 10 000 и 30+30 ...

Ищем: 7 8
1630
Простым перебором 136 мс.
1630
Метод 2: 258 мс.
1630
Метод Рупора: 54 мс.

Ищем: 3 22
921
Простым перебором 75 мс.
921
Метод 2: 245 мс.
921
Метод Рупора: 34 мс.

Ищем: 15 28
1251
Простым перебором 112 мс.
1251
Метод 2: 260 мс.
1251
Метод Рупора: 51 мс.
   Z1
 
260 - 05.08.04 - 13:34
У меня для 100 000 и 300 след результат
Ищем = 118 44
не нашли
Простым перебором 2365 мс.
не нашли
Метод 2: 6454 мс.
не нашли
Метод Z1 список1 (257) 2011 мс.
не нашли
Метод Рупора: 5206 мс.

Ищем = 86 135
28033
Простым перебором 626 мс.
28033
Метод 2: 1768 мс.
28033
Метод Z1 список1 (257) 1938 мс.
28033
Метод Рупора: 530 мс.

Ищем = 281 283
50645
Простым перебором 1136 мс.
50645
Метод 2: 2386 мс.
50645
Метод Z1 список1 (257) 1960 мс.
50645
Метод Рупора: 1144 мс.
   Guk
 
261 - 05.08.04 - 14:31
(258)тест на 10000,10,1000.
ничего не фальсифицировал.
первая 10, вторая 1000./NS/

  1  2  3

Список тем форума
Рекламное место пустует   Рекламное место пустует
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс, 1996 г.
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Ветка сдана в архив. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует