数据结构问题

时间:2010-03-31 17:57:52

标签: data-structures

请帮助我找到这些有趣的数据结构问题的优化解决方案:

  1. 给定一个包含大约1000万字的文件,设计一个用于查找字谜的数据结构
  2. 编写程序以显示文件中十个最常用的单词,以便您的程序在所有复杂性度量中都有效。
  3. 您有一个包含数百万行数据的文件。只有两条线是相同的;其余的都是独一无二的。每条线都很长,甚至可能都不适合存储器。找到相同线条的最有效解决方案是什么?
  4. 再添加一些问题:

    4)(由MS询问)您将获得一个长度为3的字符串数组。数组中的一个字符串标记为Start字符串,另一个字符串标记为End字符串。您必须将起始字符串转换为结束字符串,前提条件是您将生成的中间字符串应与其前一个字符串仅相差一个字符,并且该字符串应出现在输入数组中。 例如。如果输入是

    Array: {"fat", "tab", "eat", "see", "tub", "fab", "rat", "sel"}
    Start: "fat"
    End: "tub"
    Then the output should be 
    fat -> fab -> tab -> tub
    

    我试图解决第三个问题,并提出了两个可能的appraoches: 1)只读取所有行的第一个字,然后消除所有那些第一个字与任何其他行的第一个字不匹配的行。继续以这种方式获取剩余行的连续单词,直到您只剩下两行。你得到了答案! 2)将每一行转换为较小的表示。这可以通过以短二进制形式对每个字进行编码,然后对代表每一行的位进行异或来实现。

    编辑:我现在收集了很多数据结构问题,如果有人有兴趣在这里讨论它们,那么我可以发布更多。

4 个答案:

答案 0 :(得分:2)

我们可以使用超立方体解决第四个问题(在图论中),因此长度为3的字符串可以在Q3中表示,起始字符串为'000',并且与起始字符串不同的字符串可以表示为'001分别为','100'和'010',结束字符串为'111'。

由于超立方体是连接图,我们可以找到从起始字符串到结束字符串的至少一条路径。 如果我们设法找到最短路径(这意味着没有顶点,即没有重复的字符串),则可以解决问题。

答案 1 :(得分:0)

我认为Q2的答案可以是使用Hashmap或TRIE来存储单词及其频率。这两种结构都提供了良好的查找顺序。对于文件中的每个单词,检查单词是否已存在。如果是,请增加其计数,否则添加该单词并将计数初始化为1。

最近在微软采访中向我的一位朋友询问了这个问题。他提出的解决办法是类似的。维护HashMap和双向链表。 DLL将根据单词频率进行排序。只要在文档中添加新单词,就会相应地修改DLL以反映当前的排序列表。

我认为最有效的解决方案是使用带有双向链表的TRIE。

答案 2 :(得分:0)

我为第四个问题提出的解决方案是制作数组中所有单词的图表。 首先创建一个邻接矩阵,如果一个单词可以直接转换为另一个单词,则其值为1.

现在使用深度优先搜索来查找从“开始”字符串到“结束”字符串的路径,并返回路径(如果找到)。

请注意,您必须在此处修改深度优先搜索,以存储您到目前为止所经过的路径。为此,我没有将正在访问的节点推送到Stack,而是将完整路径推送到堆栈,这样当找到元素时,我就有从Start字符串到End字符串的完整路径。

答案 3 :(得分:-1)

我猜第四个问题可以通过回溯来解决,但不确定这是否是最优的,昨天尝试使用它解决方案似乎对我有效。