今天收到intel面试,问我一个问题,如何在一万个字符串中找到某个相关的字符串?当时感觉打得不好,回头自己又想了想,现写下感想。
方法1:最笨的方法,一个一个的遍历
方法2:采用划分子集的方法,首先以第1个字符进行划分,将a到z开头的字符串划分到不同的子集中,然后比较,接着,再到相应子集中进行划分,在比较,一直到找到为止,这个方法相较于方法1是:1,相对于每次比较的字串而言,所有首字母不相同的不再进行比较,比方说happy,肯定去以h为首字母的集合中进行比较,然后对于子串appy,只要到所有子串以a为首字母的集合中进行比较,如此下去,时间花费主要在于划分子集上,而划分子集的次数又跟happy的长度有关系,所以只需划分5次即可,所以时间复杂度是O(mn),m是要寻找字符串的长度,n是原始字符串集合大小。
方法3:采用正则表达式匹配,比如还是happy,假如将原始集合中的所有字符串和正则表达式pattern = ^h[A-Za-z]+y$进行匹配,接着在对app这个子串和子集合中进行正则表达式匹,pattern=^a[A-Za-z]+p$,最后对p进行匹配即可,时间复杂度O(mn)
方法4:采用Hadoop海量数据处理,将海量字符串分到不同的map任务中,每个任务,进行对字符串在相应的node上进行查找,接着对于所有的map的结果交给reduce任务分析,这仅仅是个方案,具体时间复杂度的话,看你有多少个map任务了。
方案5:可以采用编译原理学到的自动机,最近再看编译原理突然想到,不过对于海量数据,具体情况怎么样,还得我继续探索~~