В наиболее формальном смысле размер входных данных измеряется со ссылкой на реализацию алгоритма машины Тьюринга, и это число символов алфавита, необходимое для кодирования входных данных.
Это, конечно, довольно абстрактно, и очень трудно работать на практике, или, по крайней мере, очень раздражает - нам нужно подумать о том, как мы собираемся указывать разделители и т. Д. И т. Д. На практике обычно происходит то, что мы ищем проксите измерение размера входных данных - что - то более удобное и доступное, но это не вызывает какие - либо математические задачи в нашем анализе.
Используя ваш пример «abcde», обычно бывают случаи, когда алфавит, который мы используем для ввода, невелик, поэтому даже при использовании прокси-измерения символов мы знаем, что даже на машине Тьюринга мы можем, если нам надоело, укажите входную кодировку, которая будет преобразовывать «abcde» в некоторую закодированную форму, которая имеет длину не более 5 × c для некоторой константы c . Такое расширение на константу, как правило, не имеет значения в нашем асимптотическом анализе, поскольку мы регулярно отбрасываем постоянные факторы.55×c c
В другом случае мы часто измеряем размер входного графа по количеству вершин . Ясно, что если мы хотим указать сколь угодно большие графы, размер закодированного ввода не просто n - что случилось с краями, например? Что мы знаем, так это то, что мы можем использовать разумную схему кодирования, которая представляет граф в виде N = c ⋅ n 2 log n битов. Это скорее расширение, чем константа, но во многих интересных случаях мы имеем дело только с гранулярностью, и многочлены хорошо сочетаются разными способами, в частности, например, если мы определяем, что наше время работы O ( p (nnN=c⋅n2logn где p - многочлен, то мы знаем, что существует некоторый многочлен p ′ такой, что O ( p ( n ) ) = O ( p ′ ( N ) ) , поэтому, когда мы вернемся к формальной мере входа Мы все еще в полиномиальном времени.O(p(n))pp′O(p(n))=O(p′(N))
Место, где это может упасть, это когда вы работаете с числами. Так как число с величиной может быть закодировано в n = O ( log m ) битах, если бы наше время работы было O ( m ) , это было бы O ( 2 n ) - экспоненциальный по фактическому размеру входного сигнала - что сделало бы величину м плохой выбор для прокси для размера ввода, если мы хотим поговорить о членстве в P, например (когда вы приходите к Strongly- N P -complete и Weakly- N Pmn=O(logm)O(m)O(2n)mPNPNP-полный, запомни это). С другой стороны, если бы все, что нас интересовало, было решимостью, то это была бы достаточно хорошая мера по доверенности.
Таким образом, хотя не существует установленного правила выбора прокси-меры для размера ввода, требуется, чтобы расширение или сокращение размера прокси по сравнению с размером ввода было совместимо с тем, что вы пытаетесь доказать. Как правило, постоянные изменения коэффициентов почти никогда не имеют значения, небольшие полиномиальные факторы обычно хороши и работают для большей части основной теории, которую вы видите, большие полиномиальные факторы могут все еще работать для теории, но на практике это может быть неприятным сюрпризом, и экспоненциальные суммы изменений, как правило, слишком экстремальные.
Это зависит от вашей модели вычислений, а также, к сожалению, иногда от самого алгоритма.
Однако многие алгоритмы не измеряются относительно «фактического» размера ввода. Затем вы должны внимательно посмотреть, к чему относится утверждение анализа.
источник