Если бы я ставил себе цело перейти на микросекундные скорости, пожертвовав памятью - я бы, наверное, сделал что-то типа такого:
var ultrafastDict [][]WordsStruct // [аббат]аббатский
type WordsStruct struct {
isWord bool
isPrefix bool
subWords []string
}
Первые 5 букв слова образуют индекс в слайсе ultrafastDict. В алфавите 33 буквы, так что слайс для всех возможных комбинаций букв имел бы размер 33 ^ 5 = 39,135,393 элементов.
Если мы ищем слово до 5 букв включительно (а это подавляющее количество поисков для данного алгоритма) - нам достаточно достать элемент под индексом, образующимся из данной комбинации букв, и проверить в нём поля isWord (данная комбинация букв является словом) и isPrefix (данная комбинация букв является префиксом для других слов). Если же мы ищем слово из комбинации больше 5 букв - ориентируемся уже на массив subWords - как в алгоритме, который я описывал выше.
Для начала - подготовка словаря. Я создавал слайс:
dict [][]string // [аб]аббатский
То есть кодируем первые 2 буквы каждого слова в число - это индекс основного слайса. А по этому индексу лежит отсортированный массив слов в нижнем регистре, начинающихся с этих двух букв.
Дальше, поиск слов - проходим рекурсивно, на каждом шаге моментально находим в словаре массив слов, начинающихся с первых 2 найденных букв, а затем в цикле проходим по этому массиву и определяем - есть ли слово, точно совпадающее с текущей комбинацией букв (если есть - добавляем в список найденных слов), а также есть ли другие слова, начинающиеся с данной комбинации слов (если есть - идём на следующий шаг рекурсии, если нет - возвращаемся на предыдущий шаг).
Так как массив отсортирован - можно искать только пока префикс текущего слова в списке "меньше" найденной комбинации букв (я этого не делал, но это ещё ускорило бы поиск).
Писал когда-то подобное для 4*4 на Go — только ищет всё, потому что делает полный перебор рекурсивно. Правда, мультипоточность и хитрый старт поиска. Только что проверил время поиска на 4-ядерном макбуке с использованием словаря на 99431 слов:
Размещать можно, но нужна будет приличная избыточность — при поломке произвольного компонента сервера произвести ремонт уже не получится. Достать его с орбиты, чтобы вытянуть данные — задача, теоретически, возможная, но цена…
Кроме того, всегда существует возможность выхода из строя всего спутника со всеми его серверами — космический мусор, вспышки на солнце и т.д.
Прошлой зимой жил в месяц в Тайланде, и в качестве средства передвижения пришлось взять мотобайк — до этого из двухколёсного транспорта ни на чём кроме велосипеда особо не ездил. Для меня, как для автомобилиста, тяжело было ездить в междурядье — передвигался там только в полной пробке стоячих машин, со скоростью чуть меньше пешеходной, так как постоянно представлял последствия.
А вообще давно выработал для себя способ самообучения, который подходит для разных случаев, включая вождение авто- и мото-транспорта: каждый раз, когда мне случалось совершить какой-то манёвр, в котором я не до конца был уверен — в деталях представлять последствия того, что было бы, если бы там оказалась другая машина или человек. То есть мысленно переживать отрицательный опыт, которого у меня не было. И теперь, когда я, например, в темноте подъезжаю к неосвещённому пешеходному переходу — у меня происходит подсознательная реакция, даже волосы на голове немного становятся дыбом, и я не могу не притормозить.
А я в своё время вывел оптимальный для себя способ сдачи экзаменов концу первого курса.
На экзамене в билете, как правило, из всего объёма, который надо рассказать, было хоть что-то, что я хорошо знал. Я просто максимально детально, насколько позволяли знания, рассказывал о том, в чём плаваю, а вот то, что знаю — упоминал неохотно и вскользь, как-бы уклоняясь. Естественно, следовали уточняющие вопросы именно в эту область, где я уже и расправлял свои крылья.
Немного не об OpenGL, но всё же — а почему у вас Чёрная пятница работает для всех стран, кроме России? Для всех есть скидка в 20% кроме покупателей в рублях.
Ссылка на Perl скрипт для повышения резкости изображения не работает: «this goo.gl shortlink has been disabled». И, раз уж пишу в комментариях, поправьте, пожалуйста, вот тут:
А мне, как минимум для дева, понравилось использовать Caddy. Очень простое конфигурирование и автоматический HTTPS с автополучением/продлением из коробки: https://caddyserver.com/docs/automatic-https
За пул из канала с буфером — отдельное спасибо.
Меня вот давно интересует вопрос — а по какому принципу происходит очистка данных из стандартного пула? То есть как он определяет, что вот сейчас наступил момент, когда данных в пуле ровно столько, что надо удалить лишнее? И удаляет ли он при это всё, что есть сейчас в пуле или только какую-то часть?
Там, конечно, ошибка в объявлении ultrafastDict. Правильная версия:
Либо через указатели, чтобы сэкономить память (но не GC):
Если бы я ставил себе цело перейти на микросекундные скорости, пожертвовав памятью - я бы, наверное, сделал что-то типа такого:
Первые 5 букв слова образуют индекс в слайсе ultrafastDict. В алфавите 33 буквы, так что слайс для всех возможных комбинаций букв имел бы размер 33 ^ 5 = 39,135,393 элементов.
Если мы ищем слово до 5 букв включительно (а это подавляющее количество поисков для данного алгоритма) - нам достаточно достать элемент под индексом, образующимся из данной комбинации букв, и проверить в нём поля isWord (данная комбинация букв является словом) и isPrefix (данная комбинация букв является префиксом для других слов). Если же мы ищем слово из комбинации больше 5 букв - ориентируемся уже на массив subWords - как в алгоритме, который я описывал выше.
Для начала - подготовка словаря. Я создавал слайс:
То есть кодируем первые 2 буквы каждого слова в число - это индекс основного слайса. А по этому индексу лежит отсортированный массив слов в нижнем регистре, начинающихся с этих двух букв.
Дальше, поиск слов - проходим рекурсивно, на каждом шаге моментально находим в словаре массив слов, начинающихся с первых 2 найденных букв, а затем в цикле проходим по этому массиву и определяем - есть ли слово, точно совпадающее с текущей комбинацией букв (если есть - добавляем в список найденных слов), а также есть ли другие слова, начинающиеся с данной комбинации слов (если есть - идём на следующий шаг рекурсии, если нет - возвращаемся на предыдущий шаг).
Так как массив отсортирован - можно искать только пока префикс текущего слова в списке "меньше" найденной комбинации букв (я этого не делал, но это ещё ускорило бы поиск).
4*4 — Execution time: 1.323269ms
Кроме того, всегда существует возможность выхода из строя всего спутника со всеми его серверами — космический мусор, вспышки на солнце и т.д.
А вообще давно выработал для себя способ самообучения, который подходит для разных случаев, включая вождение авто- и мото-транспорта: каждый раз, когда мне случалось совершить какой-то манёвр, в котором я не до конца был уверен — в деталях представлять последствия того, что было бы, если бы там оказалась другая машина или человек. То есть мысленно переживать отрицательный опыт, которого у меня не было. И теперь, когда я, например, в темноте подъезжаю к неосвещённому пешеходному переходу — у меня происходит подсознательная реакция, даже волосы на голове немного становятся дыбом, и я не могу не притормозить.
На экзамене в билете, как правило, из всего объёма, который надо рассказать, было хоть что-то, что я хорошо знал. Я просто максимально детально, насколько позволяли знания, рассказывал о том, в чём плаваю, а вот то, что знаю — упоминал неохотно и вскользь, как-бы уклоняясь. Естественно, следовали уточняющие вопросы именно в эту область, где я уже и расправлял свои крылья.
ffmpeg -r .3 -pix_fmt rgba -s 1280x720 -pattern_type glob -i "*.JPGЭ video.mkv
Вместо закрывающей кавычки 'Э' образовалось.
Спасибо.
Меня вот давно интересует вопрос — а по какому принципу происходит очистка данных из стандартного пула? То есть как он определяет, что вот сейчас наступил момент, когда данных в пуле ровно столько, что надо удалить лишнее? И удаляет ли он при это всё, что есть сейчас в пуле или только какую-то часть?
За что вы так с нами?