两个字符串列表的交集

时间:2012-10-07 02:12:24

标签: python string algorithm data-structures set

我有一个面试问题:

  

给出两个无序客户列表,返回两个列表的交集列表。也就是说,返回两个列表中显示的客户列表。

我建立的一些事情:

  • 假设每个客户都有一个唯一的名称
  • 如果两个名单中的名称相同,则为同一客户
  • 名称的名字是姓氏
  • 没有II,Jr,怪异人物等的诡计。

我认为重点是找到一种有效的算法/使用数据结构来尽可能高效地完成这项工作。

我的进步是这样的:

  • 将一个列表读入内存,然后一次读取另一个列表以查看是否匹配
  • 将两个列表按字母顺序排列然后从一个列表的顶部开始,看看每个项目是否出现在另一个列表中
  • 将两个列表放入有序列表中,然后使用较短的列表逐项检查(这样,一个列表有2个项目,您只检查这两个项目)
  • 将一个列表放入哈希,并检查其他列表中是否存在密钥

面试官一直在问,“下一步是什么?”,所以我认为我错过了其他的东西。

有效地执行此操作的其他任何技巧?

旁注,这个问题是在python中,我刚刚阅读了sets,它似乎尽可能有效地做到了这一点。知道sets的数据结构/算法是什么吗?

2 个答案:

答案 0 :(得分:5)

它的实现方式真的无关紧要......但我相信它是用C实现的,因此它更快更好set([1,2,3,4,5,6]).intersection([1,2,5,9])可能是他们想要的

在python可读性计数很多! python中的set操作被广泛使用并且经过了很好的审查......

说另一种pythonic方式是

list_new = [itm for itm in listA if itm in listB]

list_new = filter(lambda itm:itm in listB,listA)

基本上我相信他们正在测试你是否熟悉python,而不是你能实现算法。因为他们问了一个非常适合python的问题

答案 1 :(得分:1)

  1. 将一个列表放入bloom filter并使用该列表过滤第二个列表。
  2. 将过滤的第二个列表放入布隆过滤器,并使用它过滤第一个列表。
  3. 对两个列表进行排序,并通过上述方法之一找到交集。
  4. 这种方法的好处(除了让你在访谈中正确使用半模糊的数据结构)是它不需要任何O(n)存储,直到你有(很有可能)减少问题的大小


      

    面试官一直在问,“下一步是什么?”,所以我认为我错过了其他的东西。

    也许他们会一直问这个问题,直到你的答案用完为止。


    http://code.google.com/p/python-bloom-filter/是bloom过滤器的python实现。