如何有效地管理可以删除其中一个元素或与下一个元素交换的元素列表?

时间:2019-10-27 17:50:09

标签: python python-3.x

我必须构建一个具有两个输入的程序(eventList,一个由字符串组成的列表,用于保存操作的类型和将要进行操作的元素的id; idList,一个由int组成的列表,每个都是int元素的ID)。

两个可能的事件是删除相应的id,或者将id与以下ID交换它在idList中的位置(即,如果所选的id位于idList [2]中,它将与idList [交换值]。 3])。

它必须通过具有指定超时的严格测试,并且必须使用词典。

这是用于程序设计的任务,我已经构建了该程序,但是我找不到找到体面的时间并通过测试人员超时的方法。 我已经尝试使用列表而不是字典,但是由于使用.pop()和.index()需要花费时间,我仍然无法传递一些超时,并且有人告诉我传递所有内容的唯一方法其中的就是使用字典。

我目前如何处理掉期交易:

def overtake(dictElement, elementId):
    elementIndex = dictElement[elementId]
    overtakerId = dictSearchOvertaker(dictElement, elementIndex)
    dictElement[elementId], dictElement[overtakerId] = dictElement[overtakerId], dictElement[elementId]
    return dictElement

我目前如何处理删除操作:

def eliminate(dictElement, elementId):
    #elementIndex = dictElement[elementId]
    del dictElement[elementId] 
    return dictUpdate(dictElement, elementId)

删除元素后如何更新字典:

def dictUpdate(dictElement, elementIndex):
    listedDict = dictElement.items()
    i = 0
    for item in listedDict:
        i += 1
        if item[1] > elementIndex:
            dictElement[item[0]] -= 1
    return dictElement

我希望处理20万个元素的列表,其中每个元素在1.5秒内被一个一个地删除,但是这花费了我5分钟以上的时间,对于一个包含1500个元素的idList和每个元素都与以下一个元素交换,直到idList的末尾反转为止。

1 个答案:

答案 0 :(得分:0)

令我震惊的一件事是,您将获得一个单一的操作列表,并期望返回执行所有操作的结果。这意味着您不必一一完成所有操作,而可以在一个批处理中进行操作,否则这些操作将非常耗时。

只要您知道它们在哪里,交换两个项目就是O(1)。这就是字典的来历-字典可以帮助您将一条信息与另一条信息关联起来,以使您可以在O(1)时间内找到它。在这种情况下,您想要一种找到具有给定ID的项的索引的方法。

即使您已经知道它的索引,也要从Python列表的中间删除一个项目是O(N),因为在内部它是一个数组,每次删除某些内容时都需要移走所有内容以占用空白空间那还没有结束。因此,一个幼稚的解决方案将是O(K * N),这可能是分配要设法避免的事情。但是问题中没有任何一项要求您实际上逐个删除列表中的每个项目,只是返回的最终结果不包含这些项目。

所以,我的方法是:

  • 构建id -> index的字典。 (这只是列表中的一个O(n)迭代。)
  • 创建一个空集以跟踪删除。
  • 对于每个操作:
    • 如果是交换:
      • 如果ID在您的集合中,请引发异常。
      • 使用您的词典查找两个ID的索引。
      • 交换列表中的两个项目。
      • 更新您的字典,使其继续与列表匹配。
    • 如果是删除:
      • 将ID添加到您的集合中。
  • 创建一个新列表以返回结果。
  • 对于原始列表中的每个项目:
    • 检查它是否在您的集合中。
      • 如果它在集合中,请跳过它(它已被删除)。
      • 否则,将其附加到结果中。
  • 返回结果。

其中N是列表大小,K是操作数,因此最终为O(N + K),因为您对整个ID列表进行了精确的两次迭代,并且对整个操作列表进行了一次精确的迭代,并且在这些迭代中执行的所有操作都是O(1)。