Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python IO不是';我跑得不够快_Python_Kattis - Fatal编程技术网

python IO不是';我跑得不够快

python IO不是';我跑得不够快,python,kattis,Python,Kattis,我试图回答一个关于kattis的竞争性编程问题,可以发现我的算法是正确的,但是有一个测试用例有很多输入,我的代码超时。在python中有没有更优化的IO方式 从系统导入标准输入,标准输出 导入atexit、io、sys buffer=io.BytesIO() sys.stdout=缓冲区 @atexit.register def write(): sys.\uu stdout\uuu.write(buffer.getvalue()) def main(): teque=[] 对于范围内的i(in

我试图回答一个关于kattis的竞争性编程问题,可以发现我的算法是正确的,但是有一个测试用例有很多输入,我的代码超时。在python中有没有更优化的IO方式

从系统导入标准输入,标准输出
导入atexit、io、sys
buffer=io.BytesIO()
sys.stdout=缓冲区
@atexit.register
def write():
sys.\uu stdout\uuu.write(buffer.getvalue())
def main():
teque=[]
对于范围内的i(int(stdin.readline()):
l=stdin.readline().split()
如果l[0]=“向后推”:
附加技术(int(l[1]))
如果l[0]=“向前推”:
插入(0,int(l[1]))
如果l[0]=“中间推”:
如果len(teque)%2==0:
中=长(特克)/2
其他:
mid=(len(teque)+1)/2
技术插入(整数(中间),整数(l[1]))
如果l[0]=“get”:
写入(str(teque[int(l[1]))+'\n')
如果名称=“\uuuuu main\uuuuuuuu”:
main()

因此,正如我在评论中了解到的,我实际上并没有在插入的O(1)时间内完成程序,我修复了调用2个队列的问题。这个解决方案对于Python3运行时仍然不够快,但是它超过了Python2运行时

from sys import stdin, stdout 
from collections import deque

class Teque:
    def __init__(self):
        self._teque1 = deque()
        self._teque2 = deque()

    def push_back(self, x):
        self._teque2.append(x)
        if len(self._teque2) > len(self._teque1):
            self._teque1.append((self._teque2.popleft()))

    def push_front(self, x):
        self._teque1.appendleft(x)
        if len(self._teque1) > len(self._teque2):
            self._teque2.appendleft((self._teque1.pop()))

    def push_middle(self, x):
        if len(self._teque2) > len(self._teque1):
            self._teque1.append(self._teque2.popleft())
        self._teque2.appendleft(x)

    def get(self, i):
        if i >= len(self._teque1):
            return self._teque2[i-len(self._teque1)]
        return self._teque1[i]

def main():
    teque = Teque()
    for i in range(int(stdin.readline())):
        l = stdin.readline().split()
        if l[0] == 'push_back':
            teque.push_back(int(l[1]))

        elif l[0] == 'push_front':
            teque.push_front(int(l[1]))

        elif l[0] == 'push_middle':
            teque.push_middle(int(l[1]))
        else:
            stdout.write(str(teque.get(int(l[1])))+'\n')

if __name__ == "__main__":
    main()


稍微回避这个问题,为什么你认为你的算法是“正确的”?当然,它产生了正确的输出,但是
deque
(与问题中的
teque
类似)的全部目的是,它在
deque
两端的
append()
pop()
具有O(1)时间复杂性,而您的
deque
显然没有(更不用说从中间到中间)。在这个问题中,您实际上不是
pop()
,您只是在
get
输入的索引处检索整数。我的算法通过了所有的测试用例,直到第十个测试用例收到超过时间限制的结果
append
是O(1),但我刚刚意识到,
insert()
不是,这正是我的观点。你有什么建议来修正我的算法?
insert(0,x)
是O(n),因为它必须将所有其他元素转移到索引
0