降低两个列表比较的成本

时间:2016-09-22 04:26:04

标签: python time-complexity

我想最大限度地降低两个有一些单词的列表的比较成本。在下面的代码中,A有4个字,而B有2个字,费用为O(n^2)太差了。而对于100个单词,它可能是耗时的。我可以以某种方式最小化它吗?

A= ["helry", "john" , "kat" , "david"]
d="Helry David"
B = d.lower().split()

for x in range(len(A)):
            for i in range(len(B)):
                if A[x] == B[i]:
                    print("Match = " + A[x])
                else:
                    print("No")

4 个答案:

答案 0 :(得分:1)

使用集而不是列表(顺便说一句,这些在Python中不称为数组)。你想要的是两组的交集,平均而言O(min(len(A), len(B))https://wiki.python.org/moin/TimeComplexity)。由于这个算法是内置的并且用C语言实现,因此它比你在Python代码中编写的任何东西都要快得多。

示例(A和B被认为是以前定义的):

>>> set(A) & set(B)
{'david', 'helry'}

这为您提供了A和B中包含的所有值的集合。

答案 1 :(得分:0)

  1. 首先为O(nlogn)排序数组。
  2. 在O(n)中比较它,因为你可以放心地假设某些元素之间的关系在排序后是相同的。

答案 2 :(得分:0)

  1. O(nlogn)用于排序A
  2. 对每个使用二进制搜索 B AO(log n)的元素我会m。对于B元素 O(m*logn),它将是O(m)
  3. (或)如果您使用哈希,则可以mB Hibernate: select max(profileNumber) from User_Profile org.hibernate.exception.SQLGrammarException: could not fetch initial value for increment generator at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67) at at java.lang.Thread.run(Unknown Source) Caused by: java.sql.SQLException: ORA-00942: table or view does not exist ) at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:799) at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1038) at oracle.jdbc.driver.T4CPreparedStatement.executeMaybeDescribe(T4CPreparedStatement.java:839) at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1133) at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3285) at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3329) at org.hibernate.id.IncrementGenerator.getNext(IncrementGenerator.java:85) ... 36 more Updated Succesfully Datadao.ProfileDAO@565eb0ea 元素执行。{/ p>

答案 3 :(得分:0)

您可以在 O(n)时间内使用in设置和测试成员资格来执行此操作,您仍需要遍历所有名称In A但是检查每个名称是否在名称集合中O(1)

A = ["helry", "john" , "kat" , "david"]
d = "Helry David"
st = set(d.lower().split())

for name in A:
    if name in st:
        print("Match = {}".format(name))
    else:
        print("No match")