我最近接受了一些采访,被问到一些规模问题是很正常的。 例如,你有一长串单词(dict)和字符列表作为输入,设计一个算法来找出dict中包含char列表中所有字符的最短单词。然后面试官询问如何将算法扩展到多台机器。 另一个例子是您为城市中的交叉路口设计了交通灯控制系统。如何将这个控制系统扩展到具有多个交叉点的整个城市。 我一直不知道这种"规模"问题,欢迎任何建议和意见。
答案 0 :(得分:1)
您的第一个问题与第二个问题完全不同。事实上,城市交通信号灯的控制是一项本地运营。附近有箱子可以调节,光学传感器位于检测等候车辆的灯光顶部。我想如果你需要优化流的一些目标函数,你可以将信息路由到服务器进程,然后它可以成为如何在多台机器上扩展这个服务器进程。
我不是分布式算法设计的专家,它涵盖了整个研究领域。但本科面试中的问题通常不是那么专业。毕竟他们没有采访那些专攻这些领域的研究生。以你的第一个问题为例,它确实非常通用。
通常,这些问题涉及多个数据结构(多个列表和哈希表)交互(连接,迭代等)以解决问题。一旦你找到了一个基本的解决方案,扩展基本上是在许多机器上复制该解决方案并同时使用输入的分区运行它们。 (当然,在许多情况下,这很难,如果不是不可能的话,但面试问题不会那么难)
也就是说,您有许多相同的工作人员分割输入工作负载并同时工作,但这些工作人员是不同计算机中的进程。这带来了通信协议和网络延迟等问题,但我们将忽略这些问题以达到基础。
最常见的扩展方法是让工作人员拥有较小数据结构的副本,并让他们将较大的数据结构拆分为工作负载。在您的示例(第一个问题)中,字符列表的大小很小,因此您可以为每个工作人员提供列表的副本,以及字典的一部分以处理列表。请注意,相反的方式不会起作用,因为每个持有字典的工作人员总共会消耗大量的内存,并且它不会为您节省任何扩展。
如果您的问题变得更大,那么您可能需要更多层次的拆分,这也意味着您需要一种方法来组合来自拆分输入的工作人员的输出。这是MapReduce
框架及其衍生物的一般概念和动机。
希望它有所帮助...
答案 1 :(得分:0)
对于第一个问题,如何搜索包含char列表中可以在不同计算机上同时运行的所有char的单词。 (还不是最短的)。我会以original_graph=[[0,1,1,0],[0,0,0,1],[0,0,1,0]]
save = input("Would you like to save the latest generation? ('y' to save):")
if save == 'y':
destination = input("enter destination file name:")
with open(destination, 'w') as file:
file.writelines('\t'.join(str(i) for i in original_graph))
else:
print("End of program.")
作为基础。
首先,这个问题实际上可以同时在不同的机器上运行。这是因为对于数据库中的每个单词,你可以在另一台机器上检查它(所以要检查另一个单词,你不必等待前一个单词或下一个单词,你可以将每个单词发送到不同的计算机到被检查)。
使用map-reduce
,您可以map-reduce
将每个单词map
作为value
,然后检查它是否包含字符列表中的每个字符。
Map(Word, keyout, valueout){
//Word comes from dbase, keyout & valueout is input for Reduce
if(check if word contain all char){
sharedOutput(Key, Word)//Basically, you send the word to a shared file.
//The output shared file, should be managed by the 'said like' hadoop
}
}
运行此Map
后,您将从数据库中获取所需的所有Word,并在共享文件中找到。对于reduce
步骤,您实际上可以使用一些简单的步骤来根据它的长度来减少它。而田田,你得到最短的。
关于第二个问题,我想到了多线程。这实际上是一个彼此无关的问题。我的意思是每个十字路口都有自己的计时器吗因此,为了能够处理吨交叉,您应该使用多线程。
简单术语将使用处理器中的每个核心来控制每个交叉点。而是通过一个循环遍历所有交叉点。您可以在每个核心中分配它们,以便过程更快。