Наш ответ американским лекторам




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

35 Comments

  1. Synoecium

    Немного покритикую.

    «Посмотрите график на Фиг.2.» — где подписи к рисункам по которым можно понять, что это Фиг.2 а не Фиг.3

    По графику на Фиг.2, как измерялось быстродействие алгоритмов? Что означает максимальный балл — 700?

    Что вообще за варианты 2,3,4,5, с которыми вы сравниваете свой вариант 1? Хотя вы приводите ссылку на статью из которой берутся алгоритмы для анализа, может стоит парой предложений охарактеризовать каждый алгоритм.

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

    А соответствия да, хорошая штука)

    Reply
  2. ildarovich

    (1) Приветствую любую критику, спасибо.

    Подписи к рисункам появляются при наведении на них мышкой, но будут сделаны и под рисунками.

    Максимальный балл — это 700 миллисекунд. То есть в самом сложном из проверенных случаев массив содержал 1600 вершин и 3200 ребер, алгоритмом 5 из исходной статьи был обработан за примерно 640 миллисекунд, а предлагаемым — за 270 миллисекунд (от 249 до 281, если точнее).

    Ссылка на статью приведена в самом начале моей статьи. Это «Алгоритмы. Часть 1.1. Динамические соединения». Оттуда же взята программа построения графика. То есть я просто подставил свой алгоритм на место первого алгоритма в конфигурацию из исходной статьи. Я не рисовал график с нуля, чтобы добиться максимального сходства и возможности сопоставления с графиком из исходной статьи. Оттуда же покрашенная цветом морской волны ось абсцисс и лишние в данном случае элементы легенды.

    Алгоритмы 2, 3, 4 в данном случае роли не играют. Они заведомо медленнее алгоритма 5. А алгоритм 5 называется в исходной статье «Быстрое объединение с оценкой веса и сжатием пути».

    Все замечания постараюсь исправить при ближайшем обновлении статьи.

    Reply
  3. адуырщдв

    1) Synoecium, рисунок непонятный как и в предыдущей теме, наверное чтоб понять надо скачать обработку за инфобакс. Видать авторы так задумали 🙂

    Была б интересна, и наглядней, просто цифра(-ы), оценка времени затрачиваемого на решение «случайных» задач. Например, для N=100000, случайные (M их кол-во) соединения генерируются до тех пор пока все N объектов не оказываются связанными. Соотвественно в сравнении. 🙂

    Reply
  4. ildarovich

    (3) Прилагаемая к статье обработка именно что для заданного числа вершин генерирует СЛУЧАЙНЫЕ дуги, но в конце концов определяет компоненты сильной связности (можно нажать Проверка, чтобы их увидеть). Определяет в зависимости от выбранного метода (0 — исходный, 1 — предлагаемый). Если измерять время до полной связности, то тут есть элемент случайности и сравнивать методы будет сложнее. Чтобы Вам не нужно было тратить «инфобакс», прилагаю обработку к этому сообщению.

    Reply
  5. адуырщдв

    (2)

    4 в данном случае роли не играют. Они заведомо медленнее алгоритма 5.

    В взвешенных алгоритмах выйгрыш благодаря использованию сжатия пути однако спорен, а точнее незаметен. Так что методы 3 и 5 равнозначны. чтоб там не говорили принстонские светилы.

    Если измерять время до полной связности, то тут есть элемент случайности и сравнивать методы будет сложнее. Чтобы Вам не нужно было тратить «инфобакс», прилагаю обработку к этому сообщению.

    Спасибо. Ну для N 100000, M где то 1,5 лимона будет для взвешенного объединения, независимо от метода сжатия пути. Хотя понятно, что без гарантии.

    Reply
  6. dyak84

    Все хорошо все понятно все наглядно, но название не по феншую причем здесь политика. Если человек умный и говорит по существу то какая разница кто он по национальности?????????????

    Reply
  7. адуырщдв

    (6) dyak84, Думаю автор как бы намекает Роберту Сэджвику и компании…. В первых (80-е годы) его «Алгоритмах….» был (если не изменяет память) использован для написания программ паскаль, потом были издания где использовались кресты, а сейчас принстонцы используют жабу . А надо бы использовать внутренний язык 1С Предприятия. 😉

    Reply
  8. ildarovich

    (6) Задиристое название выбрано специально для привлечение внимания. Это юмор. Юмор в стиле «А в Москве все эти штаты уж разбиты на квадраты/Кнопка красная одна/Лишь нажмешь и им хана/Это обороны меры/Это наши инженеры/Постарались для ребят/Для мышат и медвежат». Из этой же серии фотография Дианы Вишневой в качестве картинки к анонсу («а также в области балета мы впереди планеты всей»).

    Очень удачно получилось, что в нашем отечественном 1С есть средства, позволяющие решить задачу быстрее, чем показано в этой не нашей лекции.

    Кстати, в Java вообще-то тоже есть HashMap — аналог нашего соответствия (правда, в данной задаче соответствие скорее используется как HashSet). И вполне возможно, когда-то позже по тексту лекций разговор может вернуться к этой задаче с использованием других структур данных.

    Reply
  9. адуырщдв

    (8)

    И вполне возможно, когда-то позже по тексту лекций разговор может вернуться к этой задаче с использованием других структур данных.

    Вполне, обычно возвращаются в виде задач, типа перепишите. Алгоритм то трёхкопеечный, не стоит включения тяжелой артилерии. К тому ж, в Си 1600 вершин и 3200 ребер у меня отработало 16 миллисекунд с инициализацией (в отличии от «нашего ответа» который крутился аж 750 мс).

    Reply
  10. адуырщдв

    хе, хе быстрый поиск, квадратичный алгоритм, в си, для тех же параметров — 31 мс

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #define N 1600
    #define M 3200
    
    int main()
    {
    int i, p, q, id[N],arM,t ;
    srand(time(NULL));
    for (i = 0; i < N; i++) id[i] = i;
    for (arM=0;arM<M;arM++)
    {
    p=rand()%N; q=rand()%N;
    t = id[p];
    if (t == id[q]) continue;
    for (i = 0; i < N; i++)
    if (id[i] == t) id[i] = id[q];
    
    }
    return 0;
    }

    Показать

    Кто померяет в Jave?

    Reply
  11. ildarovich

    (10) А смысл? — Ведь в статьях сравнивались не языки, платформы и прочее, а алгоритмы. Ясно, что на ассемблере будет еще быстрее. На Си можно еще битовые строки попробовать. Можно и на графическом ускорителе эту же задачу решать.

    Мне было бы интереснее сравнить эти алгоритмы в Java на массивах с Java на HashSet. Хотя пример и задача довольно абстрактные и рыть тут в глубину, наверное, не стоит.

    Reply
  12. agrustny

    (2) Уважаемый профессор, объясните, пожалуйста, почему программа на 1С выполняется в 47 раз медленнее, чем на Си? Ваше мнение: каков вклад в ln(47) различных элементов, фигурирующих между компилятором Си и интерпретатором 1С?

    Reply
  13. адуырщдв

    (11)

    А смысл?

    Обязательно нужен? 🙂 А тогда вообще, есть ли смысл учить алгоритмы «с реализацией примеров на 1С», к тому ж в «вольном» переводе, переводе даже не соответвующей книги, а просто лекций???

    Reply
  14. ildarovich

    (12) Не возьмусь здесь отвечать на этот вопрос, чтобы не уходить от темы сравнения АЛГОРИТМОВ.

    Можно спросить на форуме. Тот, кто изучал работу 1С «изнутри» каким-либо дизассемблером или дебаггером (вообще-то 1С это не приветствует), наверное, сможет точнее определить состав накладных расходов, сопровождающих интерпретацию программы на 1С.

    Но если вопрос философский, то можно пройтись по ссылкам типа http://subscribe.ru/archive/hitech.kon.ittechnology/201402/11234715.html или http://habrahabr.ru/post/90942/. Видно, что 1С это не самый «гадкий утенок» среди других языков программирования. Python, Perl, PHP, Ruby так же сильно отстают по быстродействию от Си. Просто используется другой, более высокий, приближенный к предметной области уровень абстракции. За это приходится платить быстродействием.

    Reply
  15. ildarovich

    (13) Видимо, смысл

    учить алгоритмы «с реализацией примеров на 1С», к тому ж в «вольном» переводе, переводе даже не соответвующей книги, а просто лекций???

    есть. Об этом говорит высокая популярность исходной статьи у читателей.

    Reply
  16. dyak84

    (7)Спасибо за детальное обяснение, а то на фоне последних собитиий везде черты мерещатся

    Reply
  17. адуырщдв

    (15) Оптимистично. 🙂 Ну чтож, тогда остаётся ждать появления экпертов в algorithm design and analysis, выучившихся таким способом.

    Reply
  18. agrustny

    (14) Профессор, речь идет об АЛГОРИТМАХ. 1С — это самый гадкий утенок, хуже него, согласно предложенному Вами источнику http://subscribe.ru/archive/hitech.kon.ittechnology/201402/11234715.html, только Ruby, но он в танкена рельсах. Вы считаете великим достижением двукратное увеличение скорости за счет использования «правильных» структур данных? А Вы не задумывались о том, что в другой системе, производительность которой может быть на порядок больше или меньше 1С, «правильными» окажутся другие структуры? Если Вы хотите доказать производительность — доказывайте ее параметрически, или же конкретно рассчитывая флопы. А еще лучше — не морочьте людям голову, поскольку время исполнения любой программы 1С, написанной для дела, а не для развлечения, упирается в семиэтажные запросы, в которых используются составные типы данных, неявные соединения через точку и «виртуальные» таблицы регистров накопления, которые сами являются вложенными запросами (на фоне нехилого объема регистров, содержащих всю историю, часть из которой может быть нужна лишь теоретически). В таких условия оптимизировать интерпретатор с ln(47) до ln(7), конечно, никто не будет. Все равно придет Вася, сделает запрос в каждом ПриВыводеСтроки(), и все будут балдеть;). Ну, по минималке итоги ДинамоСписка в УФ через СКД дублированием запроса. Короче, страшно далеки они от народа…

    Reply
  19. ildarovich

    (18) Уважаемый agrustny, я не считаю великими достижениями двукратное увеличение скорости за счет использования «правильных» структур данных. Но если в 1С Вам потребуется решать задачу на графах, благодаря этой статье Вы, возможно, вспомните о соответствиях. При их использовании при решении этих задач на 1С (а такая необходимость встречается даже в типовых) получается гибкий, выразительный и быстрый код. Я лишь хотел это еще раз показать. Меня насторожило то, что один из читателей в комментарии http://forum.infostart.ru/forum24/topic108120/message1113541/#message1113541 захотел применить массивы в задаче определения множества аналогов номенклатуры, когда соответствие подходят лучше и решают задачу быстрее. Разницу в отклике 700 или 250 миллисекунд оператор уже чувствует.

    Я задумывался о том о том, что в другой системе, производительность которой может быть на порядок больше или меньше 1С, «правильными» окажутся другие структуры, о том, каковы потребности в памяти моего алгоритма, о том, какова идеальная структура данных для решения этой задачи, об измерении производительности в количестве операций чтения и записи и о много чем еще, но в статью поместить всего этого не получилось. Не счел эту задачу на сейчас достаточно актуальной, чтобы тратить время.

    Морочить людям головы я не стремился, и что оптимизировать нужно только то, что реально плохо (APDEX) я из своей практики знаю. И вот, например, в работе Неоплаченные долги при распределении оплаты по правилу ФИФО одним запросом и намного быстрее, чем Вы думали я именно так и делал. А почему этого никто не сделал (привел к линейной зависимости эти вычисления) раньше? Как Вы думаете?

    Reply
  20. agrustny

    (19) Я думаю, что никто этого не сделал раньше из-за отсутствия в персональной БД следующих документов:

    1) ЗаказНаПроизводство

    2) ИнтересКПроблеме

    3) ВыдающийсяТалант

    In other words, Вася, безжалостный и беспощадный, рулит вовсю.

    Профессор, если уж такое дело, не дадите на опохмелиться посмотрите мою студенческую работу http://infostart.ru/public/273699/

    Reply
  21. agrustny

    (19) Благодарю за пиво без водки деньги на ветер высокую оценку студенческой работы! Пришла вот еще какая-мысль в голову: на обсуждаемых графиках быстродействия http://subscribe.ru/archive/hitech.kon.ittechnology/201402/11234715.html отсутствует очень важный инструмент! Да-да, SQL как таковой. Ведь это же язык-интерпретатор, и в этом смысле действительно любопытно, где он на этой шкале между Си (=1 by definition) и 1С (approx 50 from estimation (9)).

    Reply
  22. mikuho

    Спасибо! не все конечно понятно, но то что хотел — освоил

    Reply
  23. Yashazz

    Вот всё мне в изложенном нравится, кроме одного: коллекция «Соответствие» не совместима напрямую ни со списками, ни с массивами, ни с таблицами значений, ни тем более с выборками запросов или результатами Построителей/СКД. Поэтому очень многое насчёт соответствий, к сожалению, сферический кодинг в вакууме, т.к. потеря времени на заполнение соответствия иногда бывает трудно соизмерима с выигрышем скорости при его последующем чтении.

    А главное, и извратные способы медленны, и заполнение циклом тоже. Вот кабы можно было, например, скопом заполнить всё соответствие из двуколоночной таблицы или из списка, или ещё откуда, но… Увы нам.

    Reply
  24. ksuman

    Причем тут алгоритмы и пример использования структуры 1С «Соответствие»?

    Алгоритмы — это простейшие операции, которые мы можем наблюдать и контролировать, а когда задача выполняется с помощью библиотек процедур, функций, классов и объектов — это не алгоритм, а иная реализация. Пытаться унизить американцев или блеснуть своим аналитическим мышлением в данном случае — плохая идея. Все равно, что к изобретению колеса добавить открытие каучука: принцип действия не меняется.

    Вот, если бы вы для применения к данной задаче использовали открытый массив с индексом с описанием метода поиска в рамках этой задачи, это было бы ответом.

    Reply
  25. ildarovich

    (24) Устал повторять, но не будьте, пожалуйста, так буквальны в понимании названии статьи. Я рассчитывал на читателей с чувством юмора. Вы прочитали комментарий (8)?

    В самой статье я говорю не об алгоритмах, а о решении той же задачи. О том, что

    При максимизации быстродействия не стоит забывать о втором слагаемом формулы <программы = алгоритмы + структуры данных>.

    Я просто-напросто, читая статью, подумал о том, как можно решить эту задачу на 1С. Попробовал использовать соответствие, поскольку применял его раньше в решении задач на графах, и получил в два с половиной раза более быстрое решение задачи, чем у автора исходной статьи. Мне показалось, что это решение будет интересным и поучительным. Вы так не считаете?

    Reply
  26. ЧИА

    применение специфики платформы для ускорения — не панацея

    в бытность свою студентом (80-90-е)

    писал на турбопаскале программу рендзю, в ЧМ участвовала

    а для увеличения производительности делал ассемблерные вставки, ручками данные между регистрами распределял

    так вот —

    1. муть это все. ибо при переделки базовых алгоритмов приходилось смотреть на эти вставки и думать — выкинуть или написать новые. не продуктивно, особенно если есть другие занятия

    2. а переделки именно алгоритмов и структур хранения данных о позициях давала ускорение в 5-20 раз, тогда как применение ухищрений — раза в 2-4

    3. так что мой совет — читайте Кнута, это полезнее

    Reply
  27. ildarovich

    (26) ЧИА, кажется, вы слишком поверхностно отнеслись к содержанию статьи и в итоге «отгадали все буквы, но не смогли назвать слова».

    Ассемблерные вставки это совсем не то же самое, что использование соответствия. Ассемблерные вставки не меняют вид зависимости в оценке трудоемкости программы, а только меняют коэффициент в формуле этой оценки. Они здесь не при чем.

    Использование соответствия проходит по пункту «переделки алгоритмов и структур хранения данных». По второй части этого пункта.

    Если еще помните работы Дональда Кнута, то у него там была такая машина MIX. В томе 1 в разделе 1.3.1 на странице 180 советского издания (оно сейчас стоит у меня на полке) написано, что каждой операции машины MIX приписывается время выполнения, типичное для современных машин. Современность там — 1968 год. Это наш перевод вышел в 1976 году.

    У нас сейчас 2014 год и не MIX, а 1С. У нее своя таблица времени выполнения отдельных операций. И моя мысль в том, что при реализации и сравнительном анализе алгоритмов на 1С нужно использовать именно эту таблицу, которая вовсе не mixed.

    Reply
  28. ЧИА

    (27)

    Если еще помните работы Дональда Кнута

    то у него есть четкое разделение, и не в 1, а в 3 томе

    глава 6.2 поиск путем сравнения ключей

    ваш метод, как я думаю, относится к 6.2.4, Сильноветвящиеся деревья

    и именно к конкретной оптимизации под реализацию в 1с

    перечитайте

    Reply
  29. ЧИА
    Современность там — 1968 год

    у меня на полке издание 2000 года

    алгоритмы и источники, те, что я заметил, до 1997г (SODA 8), 1998г (SODA 9)

    Reply
  30. ЧИА
    Современность там — 1968 год.

    и, да, в 3 томе многое минимум от 1970(80,90)+

    так что ваши книги немного устарели

    Reply
  31. ЧИА

    (27)

    Ассемблерные вставки это совсем не то же самое, что использование соответствия. Ассемблерные вставки не меняют вид зависимости в оценке трудоемкости программы, а только меняют коэффициент в формуле этой оценки. Они здесь не при чем.

    Использование соответствия проходит по пункту «переделки алгоритмов и структур хранения данных». По второй части этого пункта.

    к сожалению, вы не застали 286 и его приколы

    ассемблерные вставки позволяли пропускать чтение данных из памяти если они уже были в регистрах

    или не пушить-попить параметры, а читать напрямую из памяти / возвращать (или не возвращать, если дальше был однозначный расчет, все лежало дальше в регистрах)

    и т.д. и т.п.

    что именно меняло как саму идеологию хранения данных

    так и алгоритмы их обработки

    просто уж больно это было муторно

    Reply
  32. ЧИА
    кроме одного: коллекция «Соответствие» не совместима напрямую ни со списками, ни с массивами, ни с таблицами значений, ни тем более с выборками запросов или результатами Построителей/СКД. Поэтому очень многое насчёт соответствий, к сожалению, сферический кодинг в вакууме, т.к. потеря времени на заполнение соответствия иногда бывает трудно соизмерима с выигрышем скорости при его последующем чтении.

    и

    что именно меняло как саму идеологию хранения данных

    так и алгоритмы их обработки

    просто уж больно это было муторно

    по моему — одного поля ягоды

    Reply
  33. ildarovich

    (28) ЧИА, попробую пояснить свою мысль.

    Я совсем не против изучения книг Кнута, Сэджвика и прочих. Тем более, что сам большой любитель этой литературы. Я против делания из этого культа и бездумного применения рекомендаций и оценок из этих книг. Нужно понимать, что оценки производительности алгоритмов в книгах делались с оговорками. В расчете на определенную модель вычислителя. Если бы в этом вычислителе применялся, например, какой-нибудь «квантовый сопроцессор», который делал бы сортировку любого массива за один такт работы процессора, то оценки алгоритмов, опирающихся на сортировку, были бы другими. Есть целое направление исследования быстродействия параллельных алгоритмов, где те же классические задачи имеют другие оценки временной сложности.

    Так вот, платформа 1С предлагает нам иную модель вычислителя, где оценки относительного времени выполнения элементарных операций отличаются от используемых при анализе классических алгоритмов. Это нужно обязательно учитывать при реализации алгоритмов на 1С. Иначе полученные время выполнения программы на 1С и зависимость времени от размерности задачи просто не совпадет с действительностью, которая одна и является критерием истины, а вовсе не бездумное следование заветам какого-либо классика.

    (31) Если идеология менялась — непонятно почему был маленький выигрыш — вы же сами это отметили. Значит, неправильно менялась. Бывает. В случае, описанном в данной статье, это было не так.

    (32) Все, что сказано Яковом, совершенно верно, но к данному законченному решению не применимо.



    Что вы называете муторным? — Посмотрите на текст программы в статье! — Там десяток строчек. Использование соответствия позволило получить и быстрый и выразительный код. Мне кажется, в данном случае вы не стараетесь вникнуть в суть решения, а просто рассуждаете по шаблону.

    Reply
  34. max1c

    Алгоритм – слегка улучшенный алгоритм «Быстрый поиск». Вместо кода подмножества, используется ссылка на соответствие. При объединении все так же требуется скопировать часть подмножества (улучшение состоит в том, что не нужно сканировать весь массив).

    Если объединять (худший случай) два подмножества в каждом из которых N/2 элементов, то это потребует:

    — N/2 операций чтения из соответствия (Для Каждого Этого Из Связи[Ежа] Цикл);

    — N/2 операций вставки в соответствие (Связи[Ужа].Вставить(Этого.Ключ));

    — N/2 операций чтения из массива (…= Связи[Ужа]);

    — N/2 операций записи в массив (Связи[Этого.Ключ] =…).

    Операция «Связи[Ужа].Вставить(Этого.Ключ);» затратна и, если проанализировать алгоритм, нужна только для вычисления размера подмножества. Это бессмысленно. Быстрее работать с массивом.

    Соответствие эффективно для поиска значения по ключу. Здесь вообще нет обращений типа «Связи[][]». Для перебора можно было взять список значений (не требуется проверять уникальность при добавлении, мы ее проверяем на этапе: Связи[Ежа] <> Связи[Ужа]).

    Reply
  35. ildarovich

    (34) max1c,

    Это бессмысленно. Быстрее работать с массивом

    Вот тут нужны не голословные, а реальные доказательства. Обработку для тестирования можно взять из исходной статьи. Ваша задача проста — создать алгоритм и написать программу, не использующий соответствия, работающий быстрее моего. Кода тут всего ничего. — Попробуйте!

    Кстати, соответствие здесь действительно можно заменить списком значений (на этапе построения). Вот только будет ли это быстрее?

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *