가능한 해시 함수 중 하나는 각 문자의 발생 횟수를 정렬 한 횟수 (영어로만 가정) 일 수 있습니다. 그래서 "anagram"은 [('a', 3), ('g', 1), ('n', 1), ('m', 1), ('r', 1)]을 생성합니다.
또는 단어에서 비트 마스크를 생성하여 부정확 한 그룹화를 얻을 수 있습니다. 여기서 비트 0-25는 각 비트가 해당 문자의 유무를 나타냅니다 (비트 0은 'a'부터 비트 25까지 'z'를 나타냄). . 하지만 각 해시 그룹을 더 구분하여 처리하는 데 더 많은 처리를해야합니다. "to"에서 "too"까지.
이러한 아이디어 중 하나가 도움이됩니까? 마음에 든 특정 구현 언어 (C++, Python 또는 Scala를 할 수 있습니까?)
편집 : 몇 가지 예제 스칼라 코드와 출력을 추가 :
OK : 나는 순간 스칼라 모드에서, 그래서 내가 물어하지만 (에헴) 무엇을 할 수있는 뭔가 위로를 노크 한을 스칼라 또는 함수형 프로그래밍에 익숙하지 않다면 명확하지 않을 수 있습니다. 여기에서 영어 단어의 큰 목록 사용
: 나는 그들에이 스칼라 코드를 실행 http://scrapmaker.com/data/wordlists/twelve-dicts/2of12.txt
(약 40,000 단어의 사전과, 컴파일을 포함하여, 스크립트 모드에서 시간을 스칼라 2.9을 사용하여 약 5 초 정도 소요 가장 효율적인 코드는 아니지만 가장 먼저 떠오르는 코드). 이 첫 번째 제안을 사용하는
List(caret, cater, crate, react, trace)
List(reins, resin, rinse, risen, siren)
List(luster, result, rustle, sutler, ulster)
List(astir, sitar, stair, stria, tarsi)
List(latrine, ratline, reliant, retinal)
List(caper, crape, pacer, recap)
List(merit, miter, remit, timer)
List(notes, onset, steno, stone)
List(lair, liar, lira, rail)
List(drawer, redraw, reward, warder)
주 (문자 카운트의 목록)하지 :
// Hashing function to go from a word to a sorted list of letter counts
def toHash(b:String) = b.groupBy(x=>x).map(v => (v._1, v._2.size)).toList.sortWith(_._1 < _._1)
// Read all words from file, one word per line
val lines = scala.io.Source.fromFile("2of12.txt").getLines
// Go from list of words to list of (hashed word, word)
val hashed = lines.map(l => (toHash(l), l)).toList
// Group all the words by hash (hence group all anagrams together)
val grouped = hashed.groupBy(x => x._1).map(els => (els._1, els._2.map(_._2)))
// Sort the resultant anagram sets so the largest come first
val sorted = grouped.toList.sortWith(_._2.size > _._2.size)
for (set <- sorted.slice(0, 10))
{
println(set._2)
}
이 존재 (대부분의 회원 첫째로 세트) 아나그램의 첫 번째 10 개 세트를 덤프 보다 복잡한 비트 마스크 방법.
편집 2 : 당신은 (JAB에 의해 제안) 각 단어의 문자에 대한 간단한 분류와 해쉬 함수를 교체하고 명확하게/빠른 코드와 같은 결과를 얻을 수 있습니다 :
def toHash(b:String) = b.toList.sortWith(_<_)
질문 끔찍하게 명확하지 않다 "파일에서 단어의 모든 아나그램을 찾아"와 유사하다. 당신은 객관적인 말을 바꿔 주실 수 있습니까? –
당신이 의미하는 것은 : 나는 100 만 단어의 사전을 가지고 있는데, 나는 사전 내의 서로 다른 단어들의 집합을 식별하고 싶다. 예 : 사전에 [tap, pat, pot, top]이 있으면 [[tap, pat], [pot, top]]를보고 싶습니까? –
예 @Alex. 난 단지 몇 개의 다른 아나그램이 있길 원하나요? – vijay