我正在为一家正在构建iphone应用的初创公司工作。我想问几个问题来改进我们用于字符串匹配的算法。
我们有一个数据库,其中包含庞大的电话号码列表以及拥有电话号码的用户的姓名。让我们说数据库看起来像这样
名称phonenum
hari 1234
abc 3873
...
此数据库有大量行(约1百万)。当用户打开应用程序时,应用程序会从该人的手机联系人中获取电话号码列表,并将其与数据库进行匹配。我们返回数据库中存在的所有电话号码。现在,我们所做的是非常低效的。我们从20个电话联系人中发送电话号码。我们将其与数据库进行匹配。这将导致电话联系人数量* O(n)的复杂性。
我想到了一些改进,例如按电话号码排序数据库行,以便我们可以进行二进制搜索。除此之外,我们可以在缓存内存中包含大约10,000个电话号码的哈希表,我们可以在最初搜索此缓存内存。只有在未命中时,我们才会访问数据库并使用二进制搜索以O(log n)的复杂度搜索数据库。
此外,还存在发送电话号码以进行匹配的问题。我是这样发送它们还是将它们作为散列值发送?在提高绩效方面是否重要?
还有其他方法可以做这件事吗?
我解释了整个场景,以便您可以更好地了解我的需求
谢谢
答案 0 :(得分:4)
如果您已有SQL Server数据库,请让它来处理。在电话号码列上创建索引(如果您还没有)。一次性发送联系人列表中的所有号码(无需将它们拆分20)并将它们与数据库进行匹配。 SQL服务器可能使用比你想象的更好的索引,所以它会非常快。
或者,您可以尝试将数字插入临时表并对其进行查询,但我不知道这是否会更快。
答案 1 :(得分:2)
如果您可以将电话号码表示为数字值而不是字符串,则可以在数据库字段上放置一个索引,以便快速进行查找操作。即使你必须将它们表示为字符串,数据库字段上的索引也会使得查找值的速度足以在宏观方案中成为非问题。
您最大的性能问题是应用程序和数据库之间的所有往返行程。这是任何支持Web的程序的性能瓶颈。如果您不太可能获得高成功率(可能有2%的用户的联系人在您的数据库中),那么您最好一次性发送整个电话号码列表,因为您只是获取数据回到他们中的一些人。
如果目的是使用数据库中的数据更新用户的联系人数据,则可以从相应的字段中创建一个哈希值,并将其与电话号码一起发送。让数据库保持这些字段的哈希并进行比较。如果哈希匹配,那么您不必返回任何数据,因为本地和远程版本是相同的。
成功的缓存策略需要很好地理解数据的使用方式,因此我无法根据给出的信息提供更多指导。例如,如果使用您的应用程序的手机中有90%将所有电话号码与数据库中的一小组数字相匹配,那么无论如何,请将该小组放入Hashtable。但是,如果用户可能任何电话号码不在那个小组中,那么您将不得不进行数据库往返。关键是构造一个查询,允许数据库在一次旅行中返回您需要的所有数据。
答案 2 :(得分:0)
我将电话号码分为三部分
例子777.777.7777
每个部分都可以存储到int中并用作哈希标记。
这意味着您的数据存储将成为一系列哈希表。
或者您可以将整个数字强制转换为int,然后将其用作哈希键。但是为了获得快速的结果,你需要更多的桶。
干杯