Кто-нибудь знает автоматические методы оценки алгоритмической сложности?
Пост не совсем про хайлоад, но надеюсь достаточно "хакерский". Кто-нибудь знает автоматические методы оценки алгоритмической сложности? Мне приходит в голову 4 метода: (1) в-общем конечно можно просто мерять процессорное время gettimeofday/RDTCS, меняя условные n. Есть сомнения в том, что за несколько итераций получится определить сложность. Во-первых это не совсем сложность - но это практически даже плюс, нужно именно время/такты процессора. Во-вторых из-за каких-нибудь side effects в многозадачной/виртуальной среде (впрочем, может быть я это зря, и ядро будет считать точно даже для загруженных виртуалок - не пробовал).(2) Можно "влезть" внутрь интерпретатора байт-кода и считать число операций. Сработает только если есть фаза генерации байт-кода.(3) Можно использовать мок-объекты (типа map<Mock,int> map) - накладывает ограничение на текст программы, доступно далеко не во всех языках (я нашел только пример на Си++, нужно оперировать только замоченными базисными структурами данных).(4) Можно написать "парсер" кода и на выходе получить код с "каунтерами" операций. Главная проблема будет в том, чтобы отловить и обработать работу с готовыми структурами данных или с другими либами, не уверен, что это вообще можно сделать.Задача исключительно на размять мозги, практическое применение только если "олимпиадное", типа можно сделать не такими "тупыми" проекты навроде Project Euler (они вроде не считают сложность). Что думаете - как это можно бы сделать? Или есть какие-то готовые решения/статьи?UPDATE: в каментах пишут, что codility это делает, и сносно
644
37
Comments