Algorithm 技能集匹配算法

Algorithm 技能集匹配算法,algorithm,comparison,matching,array-algorithms,Algorithm,Comparison,Matching,Array Algorithms,我在一次采访中被问到这个问题 我一直在试图找到一个优雅的算法来解决这个问题,但一直没能做到 给出一份人员列表(以数字-id表示),其技能集如下: C:1,8,12,14 C++:3,7,8,12,15 perl:1、2、3、8 鲁比:14,23 给定技能列表,返回与所需技能集匹配的id: [例] 技能集:C+C++ 答案是8,12 技能集:C、C++、Perl匹配至少2种技能 答案是1,3,8,12 id列表最初未排序,但我首先对它们进行排序。 天真的方法是采取一个列表(比如C++第二个例子),

我在一次采访中被问到这个问题

我一直在试图找到一个优雅的算法来解决这个问题,但一直没能做到

给出一份人员列表(以数字-id表示),其技能集如下:

C:1,8,12,14

C++:3,7,8,12,15

perl:1、2、3、8

鲁比:14,23

给定技能列表,返回与所需技能集匹配的id:

[例]

技能集:C+C++ 答案是8,12

技能集:C、C++、Perl匹配至少2种技能 答案是1,3,8,12

id列表最初未排序,但我首先对它们进行排序。 天真的方法是采取一个列表(比如C++第二个例子),并将它与另一个列表(比如java)进行比较,使用排序顺序。
有没有算法或更好的方法

取决于技能的数量。如果它很小,我会使用素数。更准确地说: 创建表
技能[n]
(其中n是用户数)。用
1
s填充它。然后,如果用户知道第一个技能(在本例中是C)乘以第一个素数(2),如果他知道第二个技能乘以第二个素数,等等

然后,如果您想找到用户
i
是否知道第二项技能(C++),只需检查
skills[i]%3==0

例如: 寻找技能价值: 用户1知道技能1(C)和技能3(Perl),这意味着他的技能值是1*2*5=10。用户2知道技能3,所以他的技能值是1*5

<找到所有可以使用C、C++、Perl匹配的用户:2:

for(int i=0;i<n;i++){
    int howMany=0;
    if(skill[i]%2)==0)
        howMany++;
    if(skill[i]%5)==0)
        howMany++;
    if(skill[i]%7)==0)
        howMany++;
    if(howMany>=2)
        addToResult(i);
 }
让我们找一个懂C、Perl的人 我们将第1行和第3行中的所有值相加,得到

 SUM  2 | 1 | 1 | 
只有列1的值>=2,这意味着它是唯一满足条件的列。 现在,让我们尝试找到一个使用C、C++和Perl的人,匹配2

SUM  2 | 1 | 2

现在我们知道用户1和用户3的值总和>=2,因此它们满足这些标准。

下面是一个有效的算法:-

  • 对每项技能使用一组id
  • 要检查id是否有技能,只需检查HashSet
  • 注意:

    这个算法是
    O(n*S)
    其中
    n
    是人数,
    S
    是需要的技能数量。我认为没有更快的算法

    编辑:


    除了搜索所有n个人之外,您还可以只与至少具备所需技能之一的人进行检查。在许多情况下,这将节省大量计算时间。

    您的第一个示例没有意义,因为您没有任何懂Java的人。你忘了添加它们?@JerryCoffin你说的是第二个例子。首先是“技能集:C++和java回答是8”@ XYZK:OOPS——非常正确。抱歉,弄乱了这个例子。提到的Java没有Java列表。现在编辑它。谢谢你的回复。这是一个好主意。如果技能集的数量和人数都非常庞大(比如说以百万计),那该怎么办?@hereforanswers说,这样做不会奏效。我马上会添加另一个想法。我喜欢这个解决方案。唯一的问题是技能阵列的存储和维护。如果我们有一百万个id,那么每项技能的数组大小将是巨大的。插入/删除将非常昂贵。此外,如果90%的人不懂某种语言,那么它将是一个稀疏数组(大部分为零)。我想这对于面试解决方案来说已经足够了。在现实世界中,一个聪明的数据库查询当然可以,但我很想了解数据库是如何在内部进行查询的。:)谢谢你的回复!维克拉姆,谢谢你的回复!这是我在面试中能想到的最好的答案!:)但他们似乎在寻找一些不同的东西,所以想知道我是否错过了一些适合这种情况的著名算法解决方案。@对于回答,我认为他们需要在我的editVikram中进行优化,是的。听起来是一个很好的优化。但正如你们所注意到的,最坏的情况仍然是O(n*s)。无论如何,这样做会更好,节省时间。
    SUM  2 | 1 | 2