#17968: python的執行效率很難通過


cij@stu.cchs.chc.edu.tw (陳英杰)

學校 : 精誠中學
編號 : 68503
來源 : [118.163.188.190]
最後登入時間 :
2024-10-25 09:47:03
a229. 括號匹配問題 -- 名題精選百則 | From: [163.23.124.34] | 發表日期 : 2019-06-06 17:37

這題的通過時間改為 1s

我的程式再怎麼精簡都無法通過,請問有人可以嗎?

 
#21401: Re:python的執行效率很難通過


lalaluk5@ntub.edu.tw (許哲綱)

學校 : 不指定學校
編號 : 120607
來源 : [120.97.28.62]
最後登入時間 :
2022-09-07 11:37:25
a229. 括號匹配問題 -- 名題精選百則 | From: [140.131.116.45] | 發表日期 : 2020-05-27 14:23

這題的通過時間改為 1s

我的程式再怎麼精簡都無法通過,請問有人可以嗎?


我也不能Q

 
#21404: Re:python的執行效率很難通過


fdhs109_GT (GT coding)

學校 : 桃園市私立復旦高級中學
編號 : 102099
來源 : [140.114.123.88]
最後登入時間 :
2024-09-05 18:00:19
a229. 括號匹配問題 -- 名題精選百則 | From: [59.115.78.24] | 發表日期 : 2020-05-27 21:39

哈,

這題雖然有人過,

但是也有可能是當時 server 的速度造成的 AC。

 

我用 cpp 寫 AC(90 ms) 了,

想說拿一樣的方法用 python 寫寫看,

結果吃了一個 TLE (3s killed)。

 

建議也算法正確的話,

python 的朋友可以試試看用 cpp。

 
#21452: Re:python的執行效率很難通過


kkmomo (kkmomo)

學校 : 不指定學校
編號 : 29247
來源 : [223.137.94.20]
最後登入時間 :
2024-06-28 12:05:12
a229. 括號匹配問題 -- 名題精選百則 | From: [118.165.80.226] | 發表日期 : 2020-06-04 23:23

bytearray + sys.stdout.buffer.write

 
#21516: Re:python的執行效率很難通過


a0987927937@gmail.com (蝸牛)

學校 : 不指定學校
編號 : 77647
來源 : [120.113.201.193]
最後登入時間 :
2022-05-24 13:16:25
a229. 括號匹配問題 -- 名題精選百則 | From: [36.239.94.76] | 發表日期 : 2020-06-13 15:58

bytearray + sys.stdout.buffer.write


完全不會 一樣TLE 可是我測資3.4ms  AC 耶 需要把輸出資料的跳行都刪掉 要不然會一直WA(line2)

以下是我的py code:

class Solution:

# @param {integer} n

# @return {string[]}

    def generateParenthesis(self, n):

        if not n:

            return []

        left, right, ans = n, n, []

        self.dfs(left,right, ans, "")

        return(ans)

 

    def dfs(self, left, right, ans, string):

        if right < left:

            return

        if not left and not right:

            ans.append(string)

            return

        if left:

            self.dfs(left-1, right, ans, string + "(")

        if right:

            self.dfs(left, right-1, ans, string + ")")

try:

    while True:

        N = 0

        N=int(input())

        print('\n')

        if 1<=N<=13:

            ans =Solution()

            String =(ans.generateParenthesis(N))

            for x in range(len(String)):

                print(String[x])

            print('\n')

        print('\n')

except EOFError:

    pass

 
#21518: Re:python的執行效率很難通過


kkmomo (kkmomo)

學校 : 不指定學校
編號 : 29247
來源 : [223.137.94.20]
最後登入時間 :
2024-06-28 12:05:12
a229. 括號匹配問題 -- 名題精選百則 | From: [118.165.225.11] | 發表日期 : 2020-06-13 19:04

一、儲存資料及輸出的方式

python string 是 immutable,每次對 string 內容修改,都會重新分配新的記憶體(可以用 print(id(var_name)) 來看物件是否有改變),

為了減少這些時間,

先想到使用一個 char array list 來存 string,最後再將 list 轉成 string 輸出,

例如:

buf = ['(', '(', ')', ')']

# buf[1] = ord('(') , ord 也花時間

buf[1] = 41

# buf[2] = ord(')')

buf[2] = 40

print(''.join(buf))

 

但發現 char array list 轉 string 也花時間,

再進一步減少輸出轉換的時間,

最後改用既可修改內容又可以直接輸出不需要額外轉換的 bytearray

 

例如: 

buf = bytearray(b'(())\n')

# 輸出 (())

sys.stdout.buffer.write(buf);

buf[1] = 41

buf[2] = 40

# 輸出 ()()

sys.stdout.buffer.write(buf);

 

# 輸出 ()()

 

sys.stdout.buffer.write(b'()' + b'()' + b'\n');

 

二、演算法改進

常見的是 dfs 分別對每個位置做 '(' 和 ')' 遞迴

因為括號是成對出現的,所以也可以把  '(' 和 ')' 看成一組來處理,也就是以 '()'為單位,就少了一倍的運算

 
#21519: Re:python的執行效率很難通過


kkmomo (kkmomo)

學校 : 不指定學校
編號 : 29247
來源 : [223.137.94.20]
最後登入時間 :
2024-06-28 12:05:12
a229. 括號匹配問題 -- 名題精選百則 | From: [118.165.225.11] | 發表日期 : 2020-06-13 19:09

# buf[1] = ord(')')

# buf[2] = ord('(')

更正筆誤

 
#30711: Re: python的執行效率很難通過


kuomartin715@gmail.com (Martin Kuo)

學校 : 不指定學校
編號 : 152634
來源 : [120.107.188.14]
最後登入時間 :
2023-05-05 00:22:10
a229. 括號匹配問題 -- 名題精選百則 | From: [49.213.195.167] | 發表日期 : 2022-06-08 12:34

from sys import stdin
from itertools import chain

legals = {1: {0b10}}

def parent(N):
	try:
		return sorted(legals[N],reverse=True)
	except KeyError:
		for i in range(max(legals.keys())+1, N+1):
			legals[i] = set(chain.from_iterable(((l+4**(i-1))*2, l+2**(2*i-1), l*4+2) for l in legals[i-1])).union(
				chain.from_iterable((a*4**j+b for a in legals[i-j] for b in legals[j]) for j in range(2, i-1)))
	return sorted(legals[N],reverse=True)


for line in stdin:
	line=line.strip('\n')
	if line:
		N = int(line)
		print(*(f"{i:b}".translate({49: 40, 48: 41}) for i in  parent(N)), sep='\n', end='\n\n')

我這樣可以耶

 
#32568: Re: python的執行效率很難通過


movep (IQ不到30)

學校 : 中國文化大學
編號 : 26772
來源 : [223.140.193.204]
最後登入時間 :
2023-01-18 17:48:11
a229. 括號匹配問題 -- 名題精選百則 | From: [1.161.18.13] | 發表日期 : 2022-10-21 07:53

from sys import stdin
from itertools import chain

legals = {1: {0b10}}

def parent(N):
	try:
		return sorted(legals[N],reverse=True)
	except KeyError:
		for i in range(max(legals.keys())+1, N+1):
			legals[i] = set(chain.from_iterable(((l+4**(i-1))*2, l+2**(2*i-1), l*4+2) for l in legals[i-1])).union(
				chain.from_iterable((a*4**j+b for a in legals[i-j] for b in legals[j]) for j in range(2, i-1)))
	return sorted(legals[N],reverse=True)


for line in stdin:
	line=line.strip('\n')
	if line:
		N = int(line)
		print(*(f"{i:b}".translate({49: 40, 48: 41}) for i in  parent(N)), sep='\n', end='\n\n')

我這樣可以耶

 

我試了以上Python code, 一樣TLE



 
#34704: Re: python的執行效率很難通過


leolin0214@gmail.com (林祺祐)

學校 : 高雄市立高雄高級中學
編號 : 186388
來源 : [106.1.66.150]
最後登入時間 :
2024-10-05 17:31:58
a229. 括號匹配問題 -- 名題精選百則 | From: [106.1.66.150] | 發表日期 : 2023-04-09 14:07

這題的通過時間改為 1s

我的程式再怎麼精簡都無法通過,請問有人可以嗎?


好像不會ㄚ

我今天再丟我的也是2s (< 1s* 3)

應該是穩穩的

 
ZeroJudge Forum