[問題] 超長字串的讀取?

作者: ddchris (克里斯)   2017-09-16 07:04:15
最近做 onlinejudge 時遇到一個狀況,
題目會給出一個超長字串(皆為數字中間以空白分隔)
ex.10 200 3 6000 40545 87242 ... (長度約10^7個數字)
之前的處理方法都是先做切割(以空白分隔)再轉成數字
list1 = input().split(' ')
list2 = [int(x) for x in list1]
但這題因為字串太長,在第一步驟時就產生 MemoryError的訊息
可是我又得判斷出字串中所有數字(任取三個) "是否有機會形成一個三角形的邊長"
像這樣的狀況 各位前輩們有什麼較好的策略嗎? 感謝!!
(新手自學中 問題若太嫩還請包涵...)
作者: Aerials (systemofadown)   2017-09-16 08:57:00
try 64-bit python? or use chunking or sqlite
作者: Django (Cython)   2017-09-16 11:44:00
每個數字的範圍有上限嗎?當數字多的時候 如果要任取三個數都無法形成三角形的話代表第3小的數至少是第1小的2倍 第5又至少是第3小的2倍所以如果有n個數任取三個都無法形成三角形 代表最大的數至少是最小的2^((n-1)/2)倍所以字串內含的數如果是int大小的話 n=70就已經肯定可以吧64bit也n=130左右就肯定可以了n=10^7如果還不行的話 裡面不知是啥天文數字XD所以應該可以根據input限制 短於某個長度才來判別太長的就直接輸出可以
作者: uranusjr (←這人是超級笨蛋)   2017-09-16 22:15:00
可以一次讀一個再出來自己組, 讀到不是數字就代表要斷問題應該不是單一數字的大小, 是有很多個數字
作者: Django (Cython)   2017-09-17 00:47:00
有重複還是一樣可以那樣bound吧n超過100在那個範圍內就不可能找不出三條湊三角形了你也不用真的去排序 排序只是證明必存在3條湊三角形而已100*10也頂多1000位 所以例如不到1000位就全讀進來硬爆超過就直接輸出可以'
作者: uranusjr (←這人是超級笨蛋)   2017-09-17 00:55:00
他的問題就是只會整行讀不知道怎麼只讀幾個數字啊 XD
作者: Django (Cython)   2017-09-17 00:59:00
所以他是input()爆掉不是split()爆哦
作者: uranusjr (←這人是超級笨蛋)   2017-09-17 01:05:00
看起來他只讀部分行或讀進來只拆部分項兩個都不會啊 XD我的意思是他的問題不是演算法, 而是在 Python 的使用
作者: Django (Cython)   2017-09-17 01:08:00
嗯應該是
作者: CaTom (Tom)   2017-09-17 09:21:00
(偷偷筆記) 最近改用python解zerojudge也對整行讀取再切空格這點很苦惱(上週才問過類似問題)但相對的大數運算排列求冪那些全都可以輕鬆秒殺XD
作者: oToToT (屁孩)   2017-09-18 16:30:00
個人覺得python不適合做演算法題
作者: s860134 (s860134)   2017-09-19 03:59:00
樓上怎麼說@@
作者: CaTom (Tom)   2017-09-19 08:41:00
應該是python運行速度的問題硬傷吧? 像for相比C++慢了兩個數量級 偏偏演算法題為了考演算法都是用大量測資要短時間內完成 其他語言可能用稍好的演算法就能達成的py要苦思更精簡快速的方式..

Links booklink

Contact Us: admin [ a t ] ucptt.com