Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Философ, Вы писали:
Ф>>WAT!??? Удаление из связного списка ноды — O(n)????? VD>А что ты хотел для односвязенного списка? В нём хранится только ссылка на следующий элемент.
Я хотел, чтобы удаление из односвязного списка выглядело так:
[a -> b -> c]
[a -> c]
b -> null
Когда-то я писал АТД руками — в делфе не было стандартных контэйнеров. И я делал именно так.
Удаление из XY-связного списка ноды было O(1).
VD>А вот полезность LinkedList (дотнетного) заканчивается тем самым константным удалением (и вставкой в произвольное место).
Ну как бы константная вставка в произвольное место (туда, где у тебя нода смотрит — на самом деле немало. Тебе ведь ничего не мешает делать обёртки вокруг имеющихся АТД, ничего не мешает иметь ноды XY-связного списка в качестве полей, аггрегирование то никто не отменял.
Всё сказанное выше — личное мнение, если не указано обратное.
Re[4]: Задолбал Dick Seek со своей "невнимательностью"
У меня времени немного, поэтому отвечаю пока на это небольшое подмножество реплик. Ф>>Потому что HashSet более тяжеловесный — по крайней мере он опирается на хэш, который тут нафиг не упал, и добавление O(1) он не гарантирует. Потому что заранее известно, что ключи уникальны и как-либо гарантировать их уникальность не нужно. VD>Чушь полная. HashSet и Dictionary очень даже лехковесный. Данные там хранятся в одном списке, а доступ идет за ~константное время. Для современных процессоров LinkedList вообще не лучший выбор, так как ухудшает локальность памяти (узлы шире и могут располагаться в разных участках памяти).
Влад, а подумать!?
Специально для тебя эксперимент провёл. Сам бы этого не делал — и так знал.
код
using System;
using System.Collections.Generic;
namespace ADT_SpeedTest
{
class Program
{
static void Main(string[] args)
{
var list = new List<string>();
var llist = new LinkedList<string>();
var hashSet = new HashSet<string>();
const int maxI = 256;
const int maxJ = 20;
const int total = maxI * maxJ;
var array = new string[total];
for (int j = 0; j < total; j++){
array[j] = j.ToString("D7");
}
Console.Write(" ");
for (int i = 0; i < maxI; i++){
int max = 20 * (1 + i);
Console.Write(max);
Console.Write(" ");
var sw = System.Diagnostics.Stopwatch.StartNew();//Bfor (int j = 0; j < max; j++){
list.Add(array[j]);
}
sw.Stop();
Console.Write(sw.ElapsedTicks);
Console.Write(" ");
sw.Restart();//Cfor (int j = 0; j < max; j++){
llist.AddLast(array[j]);
}
sw.Stop();
Console.Write(sw.ElapsedTicks);
Console.Write(" ");
sw.Restart();//Dfor (int j = 0; j < max; j++){
hashSet.Add(array[j]);
}
sw.Stop();
Console.Write(sw.ElapsedTicks);
Console.Write(" ");
//===================================================
sw.Restart();//Efor (int j = 0; j < max; j++){
list.Remove(array[j]);
}
sw.Stop();
Console.Write(sw.ElapsedTicks);
Console.Write(" ");
sw.Restart();//Ffor (int j = 0; j < max; j++){
llist.RemoveFirst();
}
sw.Stop();
Console.Write(sw.ElapsedTicks);
Console.Write(" ");
sw.Restart();//Gfor (int j = 0; j < max; j++){
hashSet.Remove(array[j]);
}
sw.Stop();
Console.Write(sw.ElapsedTicks);
Console.WriteLine();
}
Console.ReadLine();
}
}
}
попробуй угадать, где кто (.net 4.8, AnyCPU, Release, w/o debug)
Ф>>Это индекс очередного символа в source — само собой там символы из source итерируются. VD>Вот именно! И там явно перебор еще один. А два вложенных цикла — это O(n²)
Это если ты итерируешься по одному и тому же. Пример: если сравнивать все символы со всеми символами текста, то будет квадрат, если сравнивать символы ключей с символами текста, то будет произведение кол-ва символов ключей на кол-во символов текста. Это очень разные множества.
Вот, прикинь, у тебя может быть 20 — 30 ключей (мой случай) и ещё много букав в тексте.
допустим ключей 20, по 4 символа
текст — 100М
Тогда:
O(n²) — 100М*100М
O(n*m) — 100М*20*4
Всё сказанное выше — личное мнение, если не указано обратное.
Здравствуйте, Философ, Вы писали:
Ф>Влад, а подумать!?
Хороший совет. Подумай.
Ф>Специально для тебя эксперимент провёл. Сам бы этого не делал — и так знал.
А на фиг мне твоя подтасованная пенесометрия?
Давай вот твой парсер разберем. Покажи полный алгоритм и я расскажу как его ускорить отказавшись от LinkedList.
А это все бесполезная подтасовка.
Ф>Это если ты итерируешься по одному и тому же. Пример: если сравнивать все символы со всеми символами текста, то будет квадрат, если сравнивать символы ключей с символами текста, то будет произведение кол-ва символов ключей на кол-во символов текста. Это очень разные множества.
Я вообще не понимаю зачем измерять удаление из хэш-табицы и зачем удалять из списков, да еще с поиском по значению и из середины.
Это бред какой-то. Шэш-табилцы и сеты обычно набивают, делают по ним лукап и никогда не чистя. Списки обычно тоже больше для формирования используют.
Ф>Вот, прикинь, у тебя может быть 20 — 30 ключей (мой случай) и ещё много букав в тексте.
20-30 это вообще ни о чем. Вот когда их хотя бы 300К, тогда можно что-то видеть.
Но у тебя реально начинается квдрат, так как ты и внутри своего алгоритма удаления цикл сделал, и используешь эту функцию в каком-то цикле. А два вложенных цикла это уже O(n²).
Ф>допустим ключей 20, по 4 символа Ф>текст — 100М
Ф>Тогда: Ф>O(n²) — 100М*100М Ф>O(n*m) — 100М*20*4
Я тебе говорю. Покажи свой код. У тебя потери совсем не там где ты их ищешь.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Задолбал Dick Seek со своей "невнимательностью"
Здравствуйте, VladD2, Вы писали:
VD>Я тебе говорю. Покажи свой код. У тебя потери совсем не там где ты их ищешь.
Да не могу я, блин, пока — там код сейчас даже в некомпилябельном состоянии, я тут загружен под завязку — ту задачу отложил, сейчас строчки в гриде раскрашиваю....
Там код ещё не дописан: всё как всегда непросто — нужно встроиться в существующую систему, которая написана впопыхах, кое-как. С моим кодом там пока нет проблем, потому что мой код там пока ещё не работает.
Закончу с раскрасками и прикручиваниями — распакую тот код.
VD>А на фиг мне твоя подтасованная пенесометрия?
Даже не знаю как это комментировать. Влад, это я слобал на скорую руку, перед тем как убегать в садик. Тащемта поэтому там заголовков стобцов нет, и легенда типа "ищите сами". Мне такой хренью, как подтасовка результатов для форумных срачей некотогда заниматься. Даже если бы мог, то не захотел бы.
Всё сказанное выше — личное мнение, если не указано обратное.
Re[6]: Задолбал Dick Seek со своей "невнимательностью"
Здравствуйте, Философ, Вы писали:
Ф>Я хотел, чтобы удаление из односвязного списка выглядело так:
Ф>[a -> b -> c] Ф>[a -> c] Ф>b -> null Ф>Когда-то я писал АТД руками — в делфе не было стандартных контэйнеров. И я делал именно так. Ф>Удаление из XY-связного списка ноды было O(1).
1. АТД и АлгТД — это не одно и то же. АлгТД — алгебраическое. АТД — абстрактный.
.
2. Удаление из односвязанного списка в общем случае o(n). В нем нужно перебрать все элементы до удаляемого и пересоздать впередиидущий элемент (так как в нем находится ссылка на удаляемый).
Ф>Ну как бы константная вставка в произвольное место (туда, где у тебя нода смотрит — на самом деле немало. Тебе ведь ничего не мешает делать обёртки вокруг имеющихся АТД, ничего не мешает иметь ноды XY-связного списка в качестве полей, аггрегирование то никто не отменял.
Мешает. У сего есть цена. И как показывает практика почти всегда можно найти более производительное решение в котором нет места двусвязанному списку. У односвязанного списка в преимуществах то, что это неизменяемая (imutamle) структура данных, да еще и алгебраический тип. У хэш-таблиц и сетов наивысшая скорость поиска по ключам. У List<T> лучшее попадание в кэш при переборах и индексном обращении.
Я вот зная все характеристики LinkedList ни разу в жизни его не применил. Где-то он плох в плане многопоточной обработки. Где-то из-за промахов в кэш. Где-то есть более быстрые структуры данных.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Задолбал Dick Seek со своей "невнимательностью"
Здравствуйте, Философ, Вы писали:
Ф>Да не могу я, блин, пока — там код сейчас даже в некомпилябельном состоянии, я тут загружен под завязку — ту задачу отложил, сейчас строчки в гриде раскрашиваю....
Ну тогда просто опиши задачу и приведи исходные данные, которые нужно обрабатывать.
Ф>Там код ещё не дописан: всё как всегда непросто — нужно встроиться в существующую систему, которая написана впопыхах, кое-как. \
Ну так может начать с рефакторинга?
Ф>С моим кодом там пока нет проблем, потому что мой код там пока ещё не работает. Ф>Закончу с раскрасками и прикручиваниями — распакую тот код.
Раскрасками? Ты код что ли подсвечиваешь?
Ф>Даже не знаю как это комментировать. Влад, это я слобал на скорую руку, перед тем как убегать в садик. Тащемта поэтому там заголовков стобцов нет, и легенда типа "ищите сами". Мне такой хренью, как подтасовка результатов для форумных срачей некотогда заниматься. Даже если бы мог, то не захотел бы.
Пойми такие пересмотри не серьёзны. Я тебе чут-чуть причешу твой код, увеличу объем данных и все сильно изменится.
Смотреть производительность нужно на реальных задачах. Вот на том же парсинге я уже много собак съел и кое что понимаю.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Задолбал Dick Seek со своей "невнимательностью"
Здравствуйте, Философ, Вы писали:
Ф>Я к чат-ботам полез до того, как проблемы возникли — пытался понять, как делать так, чтоб всё окончательно не умерло.
С ними надо аккуратнее. Надо понимать как они устроены, что им нужно и как от них получить пользу.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Задолбал Dick Seek со своей "невнимательностью"
Здравствуйте, VladD2, Вы писали:
Ф>>Я к чат-ботам полез до того, как проблемы возникли — пытался понять, как делать так, чтоб всё окончательно не умерло. VD>С ними надо аккуратнее. Надо понимать как они устроены, что им нужно и как от них получить пользу.
Я понимаю, что надо поаккуратнее. Моё негодование вызвано тем, что я хотел бы, чтобы они мне рассказывали то, чего я не знаю, или или обращали моё внимание на то, что я пропустил. Это на самом деле печалька, когда я спрашиваю про код, и мало того, что мне говорят какую-то фигню, так ещё и молчат о том, что в моём коде ошибка.
Всё сказанное выше — личное мнение, если не указано обратное.
Re[8]: Задолбал Dick Seek со своей "невнимательностью"
Здравствуйте, VladD2, Вы писали:
VD>Ну тогда просто опиши задачу и приведи исходные данные, которые нужно обрабатывать.
Исходные данные выглядят примерно так LEN($TAG1). Нужно вытащить значение тега и найти длинну строки. Формат вызова функции не задан жёстко — можно вот так: ($TAG1).LEN, или как-нибудь иначе. В конечном счёте нужно обрабатывать вот такие выражения:
2>LEN($TAG1)
Возвращать нужно double — в существующем коде везде даблы.
Сейчас реализованы вытаскивание значений тегов и бинарные операции, унарных нет.
Опыт подсказывает, что там где захотели одну функцию, захотят и ещё одну — вслед за LEN потребуется что-нибудь типа ToLower(), поэтому я делаю заранее возможность исполнять произвольную функцию (чтобы её можно было добавить за один шаг).
Основная сложность в том, как туда вклиниться — я первые полтора дня просто расшифровывал написанное. Код там очень далёк от идеала.
Ф>>Там код ещё не дописан: всё как всегда непросто — нужно встроиться в существующую систему, которая написана впопыхах, кое-как. \ VD>Ну так может начать с рефакторинга?
Мне по крайней мере до весны не дадут времени заниматься рефакторингом.
VD>Раскрасками? Ты код что ли подсвечиваешь?
Нет, про строчки в DataGridView перекрашиваю и делаю инструменты для настроек раскраски и форматирования данных. Мне тут очень много чем приходится заниматься.
VD>Смотреть производительность нужно на реальных задачах. Вот на том же парсинге я уже много собак съел и кое что понимаю.
Вот это кстати сложно: подобрать данные сложно, и вырезать/вырвать код, который надо профайлить сложно. Коду много лет.
Всё сказанное выше — личное мнение, если не указано обратное.
Здравствуйте, Философ, Вы писали:
Ф>Я понимаю, что надо поаккуратнее. Моё негодование вызвано тем, что я хотел бы, чтобы они мне рассказывали то, чего я не знаю, или или обращали моё внимание на то, что я пропустил. Это на самом деле печалька, когда я спрашиваю про код, и мало того, что мне говорят какую-то фигню, так ещё и молчат о том, что в моём коде ошибка.
Чтобы ИИшка тебе рассказала больше чем знаешь ты в конкретном вопросе, ты должен в вопросе шарить хуже неё. Тут как с людьми. Ну и у неё должны быть все входные данные.
Надо понимать, что преимущество ИИ не они лучше нас думают. Это не так. А в том, что они а) это делают очень быстро; б) знают много мелочей, которые в голову человека просто не влезают или с которыми он не сталкивался.
Ну и у них есть море проблем. Их (в следствии базовых алгоритмов) нужно прямо таки подталкивать к глубокому анализу. Они буквально ищут знания по словам. Где-то в глубине у них могут быть нужные знания, но из-за недостаточности или нерелевантности слов они могут вынуть куда более поверхностные знания.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Задолбал Dick Seek со своей "невнимательностью"
Китайский стартап DeepSeek выпустил две новые открытые модели с мощными возможностями для рассуждений — DeepSeek-V3.2 и усиленную DeepSeek-V3.2-Speciale. Таким образом компания подтвердила, что Китай играет на равных с американскими лидерами в лице OpenAI и Google.
По тестам разработчиков, модели достигают уровня GPT-5 и Gemini 3 Pro в программировании и математике. Так, DeepSeek-V3.2-Speciale взяла «золото» на Международной математической олимпиаде, Китайской математической олимпиаде, Международной студенческой олимпиаде по программированию и Международной олимпиаде по информатике.
На Американском отборочном экзамене по математике DeepSeek-V3.2-Speciale показала результат в 96,0 %, тогда как GPT-5 High набрала 94,6 %, а Gemini 3 Pro — 95,0 %. В свою очередь в тесте SWE Verified, измеряющем способности ИИ к программированию, китайская новинка набрала 73,1 % (результат GPT-5 High — 74,9 %; Gemini 3 Pro — 76,2 %).
DeepSeek утверждает, что модели серии V3.2 — это её первые нейросети, созданные для ИИ-агентов. Компания заявляет, что DeepSeek V3.2 обеспечивает производительность уровня GPT 5 при выполнении общих задач. Китайский стартап также утверждает, что DeepSeek-V3.2-Speciale обладает способностями к рассуждению, сопоставимыми с новейшей моделью Gemini 3 Pro от Google, особенно в сложных сценариях решения проблем.
DeepSeek добился прорыва за счёт двух приёмов: масштабного дообучения модели с подкреплением на специально сгенерированных сложных задачах, а также DeepSeek Sparse Attention (DSA) — подходу, когда модель не перебирает все токены, а выделяет для работы только самые важные.
DeepSeek-V3.2 уже доступна в приложении, на веб-сайте и в API-сервисах компании. К продвинутой V3.2-Speciale сейчас можно обращаться только через API, она предлагает максимальную мощность рассуждений для сложных задач.
Китайские модели от DeepSeek или Alibaba теснят решения ведущих американских разработчиков. Согласно исследованию MIT и Hugging Face, доля скачиваний новых открытых моделей по состоянию на август выросла до 17 % у китайских разработчиков против 15,8 % у американских.
Успех китайских игроков опирается на быстрый цикл обновления и фокус на открытых и эффективных моделях, которые работают на менее мощном оборудовании. Новые модели DeepSeek вышли спустя два месяца после экспериментальной V3.2-Exp и способны вновь усилить позиции Китая в ИИ-гонке.
и солнце б утром не вставало, когда бы не было меня