[英]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,因此它們滿足這些條件。
這是有效的算法:-
- 為每個技能使用ID的HashSet
- 要檢查ID是否具有技能,只需檢查HashSet
注意:
該算法為O(n*S)
,其中n
是人數, S
是所需技能的數量。 我不認為有更快的算法。
編輯:
除了搜索全部n個人之外,您還可以只與至少一組必選技能中的一方進行核對。 在許多情況下,這將節省大量計算時間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.