<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=ClassifyByAnagram%2F%EC%9D%B8%EC%88%98</id>
	<title>ClassifyByAnagram/인수 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=ClassifyByAnagram%2F%EC%9D%B8%EC%88%98"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=ClassifyByAnagram/%EC%9D%B8%EC%88%98&amp;action=history"/>
	<updated>2026-05-14T17:47:43Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=ClassifyByAnagram/%EC%9D%B8%EC%88%98&amp;diff=30273&amp;oldid=prev</id>
		<title>imported&gt;qa22ahj at 08:05, 2 January 2014</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=ClassifyByAnagram/%EC%9D%B8%EC%88%98&amp;diff=30273&amp;oldid=prev"/>
		<updated>2014-01-02T08:05:43Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| __TOC__&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= 1st Source =&lt;br /&gt;
 #include &amp;amp;lt;map&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;iostream&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;fstream&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 using namespace std;&lt;br /&gt;
 &lt;br /&gt;
 class Anagram&lt;br /&gt;
 {&lt;br /&gt;
 private:&lt;br /&gt;
 	typedef map&amp;amp;lt; string, map&amp;amp;lt;char, int&amp;amp;gt; &amp;amp;gt;::iterator MSMCII;&lt;br /&gt;
 	typedef map&amp;amp;lt; char, int &amp;amp;gt; MCI;&lt;br /&gt;
 &lt;br /&gt;
 	map&amp;amp;lt; string, map&amp;amp;lt;char, int&amp;amp;gt; &amp;amp;gt; _anagramTable;&lt;br /&gt;
 public:&lt;br /&gt;
 	void CalWhatAnagram(const string&amp;amp;amp; str)&lt;br /&gt;
 	{&lt;br /&gt;
 		MCI howManyEachAlphabet;&lt;br /&gt;
 		for(int i = 0 ; i &amp;amp;lt; str.size() ; ++i)	&lt;br /&gt;
 			howManyEachAlphabet[ str[i] ] += 1;		&lt;br /&gt;
 		_anagramTable[str] = howManyEachAlphabet;&lt;br /&gt;
 	}&lt;br /&gt;
 	void Show()&lt;br /&gt;
 	{&lt;br /&gt;
 		while( !_anagramTable.empty() )&lt;br /&gt;
 		{&lt;br /&gt;
 			MCI value = _anagramTable.begin()-&amp;amp;gt;second;&lt;br /&gt;
 &lt;br /&gt;
 			for(MSMCII i = _anagramTable.begin() ; i != _anagramTable.end() ; )&lt;br /&gt;
 			{&lt;br /&gt;
 				if(i-&amp;amp;gt;second == value)&lt;br /&gt;
 				{&lt;br /&gt;
 					cout &amp;amp;lt;&amp;amp;lt; i-&amp;amp;gt;first &amp;amp;lt;&amp;amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
 					_anagramTable.erase(i++);&lt;br /&gt;
 				}&lt;br /&gt;
 				else&lt;br /&gt;
 				{&lt;br /&gt;
 					++i;&lt;br /&gt;
 				}&lt;br /&gt;
 			}&lt;br /&gt;
 			cout &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
 		}&lt;br /&gt;
 	}&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
 	Anagram anagram;&lt;br /&gt;
 &lt;br /&gt;
 	ifstream fin(&amp;quot;input.dat&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
 	string t;&lt;br /&gt;
 &lt;br /&gt;
 	while(!fin.eof())&lt;br /&gt;
 	{&lt;br /&gt;
 		getline(fin, t);&lt;br /&gt;
 		anagram.CalWhatAnagram(t);&lt;br /&gt;
 	}&lt;br /&gt;
 	anagram.Show();&lt;br /&gt;
 &lt;br /&gt;
 	fin.close();&lt;br /&gt;
 &lt;br /&gt;
 	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
= 1st 분석 =&lt;br /&gt;
* 먼저 사전 파일을 입력받으면서, 키값은 그 단어, 키에 해당하는 값은 &amp;lt;알파벳, 그 알파벳의 출현 개수&amp;gt; Pair인 Pair를 생성한다.(--; 뭔가 좀 말이 이상하군)&lt;br /&gt;
** 여기서, 단어의 갯수를 n개, 단어의 평균 길이를 m이라 하면, 이것이 어떤 Pair인가 판단하는데 Θ(mn)의 시간이 걸린다. 다시 그것을 map 컨테이너에 집어넣는데 Θ(n)의 시간이 걸린다.&lt;br /&gt;
* 출력할때는 map 객체를 순회하면서, 한번 첨부터 끝까지 돌면서 anagram찾은건 지워준다.(좀 안좋은 방법 같기는 하다.)&lt;br /&gt;
** 이건 최대로 재수 없어도. Θ(n*n) 이상의 시간이 걸리지는 않는다.&lt;br /&gt;
* 일반적으로 단어의 갯수는 단어의 길이보다는... 아무래도 클것이다. 이 알고리즘은 총 Θ(n*n)의 수행시간이 걸린다고 할수 있다.&lt;br /&gt;
&lt;br /&gt;
= 1st 개선점 =&lt;br /&gt;
* 뭔가 더 좋은 방법 찾는중.&lt;br /&gt;
* 2만개짜리 단어장 구해서 파일 읽는 방식으로 바꿨다. 시간 재봐야겠다&lt;br /&gt;
* 기절하겠네--; 3분 걸리네--; 저게 10배로 불어나면..--; 대충 5시간으로 불어난다는 것인가..--;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= 2nd Source =&lt;br /&gt;
 #include &amp;amp;lt;map&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;vector&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;iostream&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;fstream&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 using namespace std;&lt;br /&gt;
 &lt;br /&gt;
 class Anagram&lt;br /&gt;
 {&lt;br /&gt;
 private:&lt;br /&gt;
 	typedef map&amp;amp;lt;char, int&amp;amp;gt; MCI;&lt;br /&gt;
 	typedef vector&amp;amp;lt;string&amp;amp;gt; LS;&lt;br /&gt;
 	typedef map&amp;amp;lt; MCI, LS &amp;amp;gt; MALS;&lt;br /&gt;
 	&lt;br /&gt;
 	typedef MALS::iterator MALSI;&lt;br /&gt;
 	typedef LS::iterator LSI;&lt;br /&gt;
 &lt;br /&gt;
 	MALS _anagramTable;&lt;br /&gt;
 &lt;br /&gt;
 	MCI CalculateWhatAnagram(const string&amp;amp;amp; str)&lt;br /&gt;
 	{&lt;br /&gt;
 		MCI howManyEachAlphabet;&lt;br /&gt;
 		for(int i = 0 ; i &amp;amp;lt; str.size() ; ++i)	&lt;br /&gt;
 			howManyEachAlphabet[ str[i] ] += 1;		&lt;br /&gt;
 		return howManyEachAlphabet;&lt;br /&gt;
 	}&lt;br /&gt;
 public:&lt;br /&gt;
 	void BoundAnagram(char* fileName)&lt;br /&gt;
 	{&lt;br /&gt;
 		ifstream fin(fileName);&lt;br /&gt;
 		string str;&lt;br /&gt;
 		while(!fin.eof())&lt;br /&gt;
 		{&lt;br /&gt;
 			getline(fin, str);&lt;br /&gt;
 			_anagramTable[ CalculateWhatAnagram(str) ].push_back(str); &lt;br /&gt;
 		}&lt;br /&gt;
 	}&lt;br /&gt;
 	void ShowAnagram()&lt;br /&gt;
 	{&lt;br /&gt;
 		for(MALSI i = _anagramTable.begin() ; i != _anagramTable.end() ; ++i)&lt;br /&gt;
 		{&lt;br /&gt;
 			for(LSI j = (i-&amp;amp;gt;second).begin() ; j != (i-&amp;amp;gt;second).end(); ++j)&lt;br /&gt;
 			{&lt;br /&gt;
 				cout &amp;amp;lt;&amp;amp;lt; *j &amp;amp;lt;&amp;amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
 			}&lt;br /&gt;
 			cout &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
 		}&lt;br /&gt;
 	}&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
 	Anagram ana;&lt;br /&gt;
 	ana.BoundAnagram(&amp;quot;input.dat&amp;quot;);&lt;br /&gt;
 	ana.ShowAnagram();&lt;br /&gt;
 	return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
= 2nd 분석 =&lt;br /&gt;
* 먼저 입력받을때에는 key : 어떤 알파벳이 몇번 나왔나 저장한 map 컨테이너, value : 그 string들의 list. 이런식으로 저장해준다.&lt;br /&gt;
* 1st 버젼은 출력부분에서 대부분의 시간을 까먹었었지만.. 이번엔 입력부분에서 90프로이상을 까먹는거 같다.&lt;br /&gt;
* 수행시간을 대충 계산해볼때, 단어의 개수를 n, 단어의 평균 길이를 m이라 하면, 입력 : Θ(mn), 출력 : Θ(n) 이므로 총 수행시간은 그런데 m은 n보다 훠~~~~~얼씬 작다. Θ(n)이 되는건가?--; 뭔가 좀 궤변 같다.&lt;br /&gt;
&lt;br /&gt;
= 2nd 개선점 =&lt;br /&gt;
* 뭔가 더 좋은 방법 찾는중.&lt;br /&gt;
* 1분(2만개짜리)으로 줄었다. 더 줄일수 있을까. 저게 10배로 불어나면..--; 10분정도 걸리는 걸까. &lt;br /&gt;
* 근데 파일에 출력하니까 10초(2만개짜리)만에 된다. 제길--; 파일에다 할껄&lt;br /&gt;
* 화면에 출력하는게 생각보다 많이 걸린다. 입력된건 &amp;quot;~~~ inputed!&amp;quot;라고 출력하게 했더니 10초가 걸리는데, 저걸 출력하지 않으니 1초도 안걸린다.&lt;br /&gt;
* list를 vector로 바꾸고 컴퓨터 켜자 마자 측정하니 6.2초 걸린다.&lt;br /&gt;
&lt;br /&gt;
= 지금까지 느낀점 =&lt;br /&gt;
* 알고리즘 개선으로 이정도까지 시간이 줄어들다니.. 정말 놀랍다. 더 줄여봐야겠다.&lt;br /&gt;
* 자료구조도 잘 골라야 한다.&lt;br /&gt;
* 컴터 상태도 좋아야 한다.--;&lt;br /&gt;
&lt;br /&gt;
= 최종 결과 =&lt;br /&gt;
* 17만개짜리 파일에 쓰는데 6.2초&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[ClassifyByAnagram]]&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;qa22ahj</name></author>
	</entry>
</feed>