算法可以更快地为日志文件中的每个 phone 数字找到合适的前缀?
Algorithm to find faster the suitable prefix for each phone number in log file?
有一个包含前缀列表的 csv 文件,用于根据该列表对 phone 号码进行分类。这是 prefixes.csv 的示例。此文件有将近 2000 行。
3511891,PORTUGAL-MOBILE (VODAFONE)
3511693,PORTUGAL-MOBILE (OPTIMUS)
3511691,PORTUGAL-MOBILE (VODAFONE)
34,SPAIN-FIXED
3469400,SPAIN-MOBILE (MVNO)
3469310,SPAIN-MOBILE (MVNO)
3469279,SPAIN-MOBILE (MVNO)
3469278,SPAIN-MOBILE (MVNO)
3469277,SPAIN-MOBILE (MVNO)
3469276,SPAIN-MOBILE (MVNO)
34673,SPAIN-MOBILE (VODAFONE)
243820000006,CONGO DEMOCARTIC REPUBLIC-SPECIAL SERVICES
243820000005,CONGO DEMOCARTIC REPUBLIC-SPECIAL SERVICES
243820000004,CONGO DEMOCARTIC REPUBLIC-SPECIAL SERVICES
88213200361,EMSAT-SPECIAL SERVICES
67518497899,PAPUA NEW GUINEA-SPECIAL SERVICES
56751975883,CHILE-SPECIAL SERVICES
56751975334,CHILE-SPECIAL SERVICES
56731974707,CHILE-SPECIAL SERVICES
另一方面,有一个包含数千行的巨大日志文件。这是日志的格式:
2015-11-01T00:00:17.735616+00:00 x1ee energysrvpol[15690]: INFO consume_processor: user:<<"dbdiayhg">> callee_num:<<"34673809195">> sid:<<"A1003unjhjhvhgfgvhbghgujhj02">> credits:-0.5000000000000001 result:ok provider:ooioutisrt.ym.ms
所以,我必须提取callee_num
后面的phone号码,然后将它与所有前缀逐位比较,以发现相关的国家代码是什么数字在 callee_num
之后。在这个例子中 phone 号码是 34673809195
,所以提取这个号码,转到 prefixes.csv 并逐行检查合适的前缀.
1)first time '3' from 34673xxxx
2)then 4
3) then 6
4) then 7
....
并且必须对 prefixes.csv 的每一行重复所有此过程,最后在这一行 34673,SPAIN-MOBILE (VODAFONE)
中,数字匹配。想象一下,代替 34673
的数字是 34670
,并且在检查所有行之后,没有与该数字的任何匹配项,因此应该可以保留 [ 的最后匹配项=42=] 即 34
和 return 即 SPAIN-FIX
。
我想知道在最短时间内完成这些过程的最佳算法是什么。如果我需要之前订购前缀或者我只使用字典?我怎样才能管理一切以获得高效的代码?搜索算法应该如何工作?递归函数是否是个好主意?或者如果 python 中有一些实现良好的库,请推荐它。
感谢您提供任何解决方案。
查看prefix tree (Trie)数据结构。
在扫描树的过程中,始终记住最后一个最好的结果(记住34,同时检查34***个节点)
在Python
中有很多尝试的实现
有一个包含前缀列表的 csv 文件,用于根据该列表对 phone 号码进行分类。这是 prefixes.csv 的示例。此文件有将近 2000 行。
3511891,PORTUGAL-MOBILE (VODAFONE)
3511693,PORTUGAL-MOBILE (OPTIMUS)
3511691,PORTUGAL-MOBILE (VODAFONE)
34,SPAIN-FIXED
3469400,SPAIN-MOBILE (MVNO)
3469310,SPAIN-MOBILE (MVNO)
3469279,SPAIN-MOBILE (MVNO)
3469278,SPAIN-MOBILE (MVNO)
3469277,SPAIN-MOBILE (MVNO)
3469276,SPAIN-MOBILE (MVNO)
34673,SPAIN-MOBILE (VODAFONE)
243820000006,CONGO DEMOCARTIC REPUBLIC-SPECIAL SERVICES
243820000005,CONGO DEMOCARTIC REPUBLIC-SPECIAL SERVICES
243820000004,CONGO DEMOCARTIC REPUBLIC-SPECIAL SERVICES
88213200361,EMSAT-SPECIAL SERVICES
67518497899,PAPUA NEW GUINEA-SPECIAL SERVICES
56751975883,CHILE-SPECIAL SERVICES
56751975334,CHILE-SPECIAL SERVICES
56731974707,CHILE-SPECIAL SERVICES
另一方面,有一个包含数千行的巨大日志文件。这是日志的格式:
2015-11-01T00:00:17.735616+00:00 x1ee energysrvpol[15690]: INFO consume_processor: user:<<"dbdiayhg">> callee_num:<<"34673809195">> sid:<<"A1003unjhjhvhgfgvhbghgujhj02">> credits:-0.5000000000000001 result:ok provider:ooioutisrt.ym.ms
所以,我必须提取callee_num
后面的phone号码,然后将它与所有前缀逐位比较,以发现相关的国家代码是什么数字在 callee_num
之后。在这个例子中 phone 号码是 34673809195
,所以提取这个号码,转到 prefixes.csv 并逐行检查合适的前缀.
1)first time '3' from 34673xxxx
2)then 4
3) then 6
4) then 7
....
并且必须对 prefixes.csv 的每一行重复所有此过程,最后在这一行 34673,SPAIN-MOBILE (VODAFONE)
中,数字匹配。想象一下,代替 34673
的数字是 34670
,并且在检查所有行之后,没有与该数字的任何匹配项,因此应该可以保留 [ 的最后匹配项=42=] 即 34
和 return 即 SPAIN-FIX
。
我想知道在最短时间内完成这些过程的最佳算法是什么。如果我需要之前订购前缀或者我只使用字典?我怎样才能管理一切以获得高效的代码?搜索算法应该如何工作?递归函数是否是个好主意?或者如果 python 中有一些实现良好的库,请推荐它。
感谢您提供任何解决方案。
查看prefix tree (Trie)数据结构。
在扫描树的过程中,始终记住最后一个最好的结果(记住34,同时检查34***个节点)
在Python
中有很多尝试的实现