#java #python #алгоритм
Вы, наверное, посчитаете этот вопрос глупым, но все же... Есть два алгоритма на Python и Java, делающие одинаковые вещи и написание почти один в один, но при проверке (если интересно что код делает, то почитайте в Statement) алгоритм на Java проходит все отлично, а на Python видает ошибку Time Limit Код на Java //package allukrainianOlimpiad; import java.util.ArrayList; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String str1 = scanner.next(); scanner.close(); ArrayListres = new ArrayList<>(); ArrayList str = new ArrayList<>(); for (char i : str1.toCharArray()) { str.add(i); } for (int i = 1; i < str.size(); i++) { if (str.get(i) == ')') { for (int j = i; j >= 0; j--) { if (str.get(j) == '(') { res.add(j + 1); res.add(i + 1); str.set(i, '@'); str.set(j, '@'); break; } } } } System.out.println(res.size() / 2); for (int i = 0; i < res.size(); i += 2) { System.out.println(res.get(i) + " " + res.get(i + 1)); } } } Код на Python expression = list(input()) result = [] for i in range(len(expression)): if expression[i] == ')': for j in reversed(range(i)): if expression[j] == '(': result.append([j + 1, i + 1]) expression[i] = expression[j] = '1' break print(len(result)) for i in result: print(str(i[0]) + ' ' + str(i[1])) Проверка Вопрос Почему алгоритм на Java справился намного быстрее чем на Python? И как можно это пофиксить?
Ответы
Ответ 1
Ошибок в коде Python не вижу. Вижу медленный алгоритм, который при определённых условиях будет сильно отставать от оптимального. Java быстрее Python, поэтому решение на Java уложилось в установленное время, на Python же неоптимальность алгоритма проявилась. Посмотрите сравнительные тесты Java vs Python. Я решил эту задачу на Python, используя быстрый алгоритм, который находит решение за один проход: expression = input() stack = [] result = '' cnt = 0 for idx, char in enumerate(expression, 1): if char == '(': stack.append((idx,char)) elif char == ')': if stack and stack[-1][1] == '(': result += f"{stack.pop()[0]} {idx}\n" cnt += 1 print(cnt) print(result, end='') Результат: Я сравнил эти два алгоритма (мой и ваш) программой time на Linux, используя такое входное выражение: expression = '(' * 100 + "4" + "+((7-4)+(4+4))*(7-4)" * 10000 + ')' * 100 Результат: Мой = 0.08 с Ваш = 1.727 с Думаю, у них есть похожие тесты, поэтому ваше решение и не прошло. Для интереса сравните время работы ваших решений на Java и Python с этим же выражением.
Комментариев нет:
Отправить комментарий