我有一份包含来自人口普查的12K亚洲姓氏的名单和一份名称为200K的名单。我想将这些200K人归类为亚洲人或非亚洲人,因为他们的姓氏出现在我的12K名单上。
有没有一种快速的方法可以验证列表中最重要的一个是否包含12K列表中的一个姓氏?
答案 0 :(得分:4)
执行此操作的最佳方法是将12K列表转换为设置数据结构。然后,您可以迭代人口普查数据并检查每个人是否在集合中。
# O(n) where n is the length of the surname_list
surname_set = set(surname_list)
for name in census:
# This is now O(1) operation
if name in surname_set:
do whatever...
这几乎可以肯定是用Python或任何语言完成所需内容的最快方法,并且在200K大小的列表上应该相当快。
Wai Leong Yeow建议使用二进制搜索,这比直接检查列表更快,但仍然是200K不同名称的O(log n)操作,其中N是12,000,这意味着它可能会超过迭代部分速度慢10倍(这是一种简化 - 实际上有一些常数因素被大O符号掩盖,但恒定时间解决方案当然仍然更快)。对它进行排序将花费O(n log n)时间,其中将其转换为集合花费O(n)时间,这意味着该方法也具有更快的预处理。答案 1 :(得分:0)
这取决于你真正的问题。你想要机器学习(如你标记:分类)来预测亚洲/非亚洲名称吗?
如果是:尝试一些半监督方法。要做到这一点,首先随机选择(接近10%)你的200k数据,然后在12k中搜索它,如果存在,将其标记为1,否则将其标记为0.然后使用一些分类算法,如随机森林,SVM或KNN。你也可以为你的名字建模,比如Bag Of word(在你的问题Bag Of Letter!或类似的东西):https://en.wikipedia.org/wiki/Bag-of-words_model
对于分类任务,请查看scikit-learn lib:http://scikit-learn.org/
如果否(您不想使用机器学习解决方案): 存在一些快速字符串搜索算法,其使用一些技术来搜索其他字符串的语料库中的字符串。有很多算法,比如Boyer Moore:https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string_search_algorithm
有关详细信息,这可能很好:https://softwareengineering.stackexchange.com/questions/183725/which-string-search-algorithm-is-actually-the-fastest
答案 2 :(得分:0)
我建议在训练任何机器学习模型之前在第一步中使用local sensitive hashing。这可能会有所帮助,因为你没有很多功能。如果你想要更强大的东西,你可以使用Naive Bayes和一些特征工程。
答案 3 :(得分:-1)
取决于你的意思"快速"。
James建议使用Python内置的set
来测试会员资格。 Python的set
实现使用哈希表。 平均时间复杂度为O(1),但最差情况可以为O(n),其中n是亚洲姓氏集的基数。因此,在最坏情况场景中,可能最终只有O(mn)而不是O(m),其中m是要分类的名称集的基数。
供参考,请参阅:https://wiki.python.org/moin/TimeComplexity
如果您想在最坏的情况下获得保证,您可以通过对集合n
进行排序并进行二分查找来实现。这将最终导致O(m lg n)时间复杂度。
二进制搜索:https://docs.python.org/3.1/library/bisect.html
这实际上取决于散列函数对数据的效果。