簡體   English   中英

技能集匹配算法

[英]Skill set matching algorithm

采訪中有人問我。

我一直在嘗試找到一種解決此問題的優雅算法,但一直未能做到。

給定具有其技能的人員列表(以數字表示-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)進行比較。

有沒有一種算法或更好的方法?

取決於技能的數量。 如果很小,我將使用質數。 更精確地講:創建表skills[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);
 }

另外,您可以創建一個二維數組,其中列對應於人員,行對應於技能。 如果將值設置為1,則表示人們知道如何使用該技能;如果將其設置為0,則他們不會。 然后,只需添加所需的所有行的值,並找到合適的用戶。

例:

 C    1 | 0 | 0 |
 C++  0 | 0 | 1 |
 PERL 1 | 1 | 1 |

讓我們找到一個了解C,Perl的人-我們將第1行和第3行的所有值相加,得到

 SUM  2 | 1 | 1 | 

只有第1列的值> = 2,這意味着它是唯一符合條件的列。 現在,讓我們嘗試找到使用C,C ++和PERL並匹配2的人

SUM  2 | 1 | 2

現在我們知道用戶1和用戶3的值之和> = 2,因此它們滿足這些條件。

這是有效的算法:-

  1. 為每個技能使用ID的HashSet
  2. 要檢查ID是否具有技能,只需檢查HashSet

注意:

該算法為O(n*S) ,其中n是人數, S是所需技能的數量。 我不認為有更快的算法。

編輯:

除了搜索全部n個人之外,您還可以只與至少一組必選技能中的一方進行核對。 在許多情況下,這將節省大量計算時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM