2015-07-15 2 views
4

У меня есть два файла исходного кода Java, которые делают то же самое, дают тот же результат. Они немного отличаются от кода, который они содержат, как в приведенном ниже примере. Мне нужен алгоритм, который измеряет скорость сходства (идентичности) между этими двумя файлами кода Java.Алгоритм сопоставления кодов

Пример

/* First file */ 
public int inc (int n) { 
    return ++n; 
} 

/* Second file */ 
public int inc (int n) { 
    return (n+1); 
} 

Существует алгоритм, который показывает, что эти два файла сделать то же самое?

Заранее спасибо

+0

Вы можете всегда проверять вывод, чтобы убедиться, что он такой же или нет. Могут быть много способов добиться того же. Это зависит от того, как реально реализовать его. Вы должны убедиться, что вы хотите, чтобы сходство в * Way * или * Destination/Result * –

+5

В общем случае определение того, являются ли две программы одинаковыми (для всех входов), является неразрешимой проблемой (я считаю). Тем не менее, вы можете сделать лучше в конкретных случаях. Например, если вы можете показать, что ваш код не имеет побочных эффектов (т. Е. Является чистым), вы можете перетаскивать все входные значения и сравнивать их. –

+0

Зависит от того, что делают ваши программы. Если они генерируют некоторый вывод текста (или даже число в результате), вы всегда можете сравнивать результаты. В противном случае - просто сравните код с BeyondCompare, например. – Artur

ответ

4

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

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

+0

красивый ответ – dlavila

+0

Это предполагает, что набор «всех возможных входов» конечен. Рассмотрим строки/входные потоки/сетевые соединения в качестве контрпримера. –

+0

@OliverCharlesworth Нам даже не нужно заходить так далеко - он перестает быть осуществленным примерно на 20 байтов или около того :) –

0

К сожалению, такого алгоритма не существует.

Почему? См: https://www.cs.rochester.edu/~nelson/courses/csc_173/computability/undecidable.html

специально раздел с надписью «Эквивалентность проблема неразрешима»

Чтобы по-настоящему понять, почему это поможет освоиться в таких областях, как разрешимость, машинах Тьюринга, а также различные другие типы автоматов

1

Игнорирование всех сложных деталей. Вот вам наивный алгоритм школьного уровня.

Тест 1: Сначала подсчитайте количество переменных, используемых в обеих программах. Ознакомьтесь с разницей между ними и определите пороговое значение для прохождения теста в зависимости от ваших потребностей и программ, которые вы сравниваете.

Тестирование 2: Затем определите тип данных, который используется в обеих программах в течение максимального времени, и если тип данных отличается, то в большинстве случаев программы будут отличаться, но опять же, это не всегда так.

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

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

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

0

Если вы хотите написать программу, которая обнаруживает подобную работу, вы можете попробовать выполнить поиск по работе программного обеспечения Turnitin.

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

  1. Вы можете создать "синонимы" для определенных слов/кода. Пример x++ аналогичен x+=1, x=x+1, ++x и так далее. Однако обратите внимание, что иногда x++ и ++x означают совершенно разные вещи в кодировании. Таким образом, ваша программа никогда не может быть на 100% точнее, чтобы судить о сходстве.

  2. Ваша база данных «синонимов» должна быть достаточно большой, чтобы обрабатывать различные случаи.

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

Пример: вместо того, чтобы писать x++, они могли бы написать x=(x+2)-1 что означает то же самое, и независимо от того, насколько велика ваша база данных синонимов, Вы никогда не можете поймать этого.

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

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

Смежные вопросы