Dictionary를 키로 사용하는 대신 "need"를 "d1e2n1"이라는 문자열로 변환하는 것은 어떻습니까? 이 문자열을 만들려면 이진 트리를 사용할 수 있습니다. 문자는 키로 사용되고 문자는 값으로 사용됩니다. 바이너리 트리는 자동으로 키에 의해 정렬됩니다. 이는 사전에 해당하지 않습니다.
이진 표현과 XOR 연산을 결합하여 단일 해시 값에서 조합 해시 값을 계산할 수 있습니다. C#을, 당신은 같은 것을 할 것입니다 : 정렬되지 않은 목록의 항목을 찾기
public override int GetHashCode()
{
// Combine hashcode of a and b
return a.GetHashCode()^b.GetHashCode();
}
는
오 (N) 작업입니다. 이진 검색이 사용되는 경우 정렬 된 목록에서 항목을 찾는 것은 O (log (n)) 연산입니다.
사전의 목록에서 단어를 찾는 것은 O (1 + n) 연산 또는 O (1 + log (n)) 연산과 동일합니다. 이는 O (log (n)) 연산과 동일합니다.
EDIT 다음 단어에 대한 이러한 정의를 이용
private string GetFrequency(string word)
{
var dict = new SortedDictionary<char, int>(); // Implemented as binary tree
foreach (char c in word.ToLower()) {
int count;
if (dict.TryGetValue(c, out count)) {
dict[c] += 1;
} else {
dict[c] = 1;
}
}
return dict.Aggregate(new StringBuilder(), (sb, item) => sb.Append(item.Key).Append(item.Value), sb => sb.ToString());
}
:
var anagrams = new Dictionary<string, List<string>>();
foreach (string word in words) {
string key = GetFrequency(word);
List<string> list;
if (anagrams.TryGetValue(key, out list)) {
list.Add(word);
} else {
list = new List<string> { word };
anagrams.Add(key, list);
}
}
그것은 키를 얻기 위하여이 방법을 사용한다 : 여기서
가 가능한 구현 ...
var words = new List<string> { "need", "eden", "team", "meat", "meta", "Nat", "tan" };
이 테스트 ...
foreach (var item in anagrams.OrderBy(x => x.Key)) {
Console.WriteLine();
Console.WriteLine(item.Key + ":");
foreach (string word in item.Value.OrderBy(w => w)) {
Console.WriteLine(" " + word);
}
}
...이 출력
생산
a1e1m1t1:
meat
meta
team
a1n1t1:
Nat
tan
d1e2n1:
eden
need
EDIT # 2 : 시험 결과가 될
private string GetFrequencyByBenVoigt(string word)
{
char[] chars = word.ToLower().ToCharArray();
Array.Sort(chars);
return new string(chars);
}
벤 보이트 의해 제안 여기
주파수 계산이다
aemt:
meat
meta
team
ant:
Nat
tan
deen:
eden
need
변경 가능한 키가있는 사전은 –
통증의 처방입니다. 그러나 전형적인 .net 코드 벤에서 가장 일반적인 사전 키가 아닙니까? – ioWint
은 가장 일반적인 사전 키가 아닙니까? 아니요, 사전 및 기타 컬렉션 유형은 다른 사전의 키로 자주 사용되지 않습니다. –