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

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

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

ОФФ Для рупора...

Я
   NS
 
05.08.04 - 12:27
Если первых мало разных, а вторых много -
То твой метод проиграет - сложность будет эн логарифмов.
(попробуй)
100 000 строк...
первое - рандом(10), второе - рандом (10000)
 
  Рекламное место пустует
   Волшебник
 
1 - 05.08.04 - 12:34
Тема должна отражать суть сообщения.
   NS
 
2 - 05.08.04 - 12:35
(1) Так и отражает - в виду того, что ветка про поиск в ТЗ закрыта - это личное сообщение для AVB.
   Рупор абсурда
3 - 05.08.04 - 12:36
(0) Там ещё и ошибочка ..., внимательный GrayT указал ...
Надо так:

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

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

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

Т.е. должно работать ещё быстрее ...
   NS
 
4 - 05.08.04 - 12:41
перем случ;

Процедура Рандомизе()
    случ=_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 мс.
//////
перебор стабильней.
   Волшебник
 
5 - 05.08.04 - 12:42
Та тема НайтиЗначение() в ТЗ по двум колонкам. Возможно ли? стала слишком длинной и закрылась автоматически. Я поправил движок.
   NS
 
6 - 05.08.04 - 12:43
Эту ветку можно грохать.
   Волшебник
 
7 - 05.08.04 - 12:48
(6) Теперь уже поздно. Она выросла и стала достоянием форума, поскольку содержит знание! :)
   BorisG
 
8 - 05.08.04 - 12:50
(4) Сергей, если намерен был продолжать спор по ТЗ, следовало так тему и назвать.
   BorisG
 
9 - 05.08.04 - 12:51
(7) Надо редактирование вводить.
   Волшебник
 
10 - 05.08.04 - 12:55
(9) Ок, подумаем.
 
  Рекламное место пустует


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