2017-08-31 74 views
2

問題

我正在爲我的迷宮求解器開發一個廣度優先搜索算法,並且它工作至今。我通過複製前一個並追加當前值來跟蹤當前堆棧。創建列表的多個副本的最快方法

由於複製列表需要大量的時間,我想在一個操作中創建列表的多個副本。

我到目前爲止已經

  • 複製列表嘗試,並將其分配給多個變量。

    l = [1, 2, 3] 
    a = b = c = l[:] # Just creates references and no individual lists 
    
  • 使用numpy的陣列,copy功能(除了list[:]更快)。

問題

什麼是創建一個列表的多個副本最快的方法?

+0

你真的需要清單嗎?我通常會爲這樣的應用程序尋找[意大利麪條堆棧](https://en.wikipedia.org/wiki/Parent_pointer_tree),並且只有在找到目標後才創建列表,如果我需要列表。 – user2357112

+0

你正在使用'l [:]',所以我假設你想要一個淺拷貝? – stybl

+0

@ user2357112我不需要列表。我將使用哪種數據結構來保存這樣的堆棧?一本字典? – jsmolka

回答

5

不要使用普通的Python列表爲您的堆棧。使用Lisp風格鏈接的列表,讓您的堆棧分享他們的大部分彼此和建設有一個額外的元素的新的堆棧結構的恆定時間:

def empty_stack(): 
    return() 
def push(stack, item): 
    return (item, stack) 
def stack_to_list(stack): 
    l = [] 
    while stack: 
     item, stack = stack 
     l.append(item) 
    return l[::-1] 

這裏,push運行在固定時間,併產生一個新的堆棧,而不會突變舊的,因此您可以在舊堆棧上重複調用push而不復制它。

+1

我可以問一下,這是什麼?你是用python建模一個棧嗎? –

+2

@cᴏʟᴅsᴘᴇᴇᴅ:這是一個堆棧實現,其中一個空棧由一個空元組表示,而一個非空棧表示爲'(頂部項目,包含其餘項目的棧)'對。如果您有功能語言方面的經驗,可能會更熟悉;在一些功能語言中,它甚至是語言的核心數據結構。 – user2357112

0

你可以只批量複製它:

def copyList(thelist, number_of_copies): 
    return tuple(thelist[:] for _ in xrange(number_of_copies)) 

a, b, c = copyList(range(10), 3) 

這裏有一個live example

+0

如果您放置3個以上的副本,則這不起作用。 –

+0

@Avión,如果你使用更多的方法,你可以捕獲變量中的元組中的所有副本,或者使用更多的變量進行解壓縮,這是因爲拆包而引起的。 – Netwave

相關問題