Пример #1
0
UINT32 MeowPinyin::MakeTreeNode(UINT32 _parent, UINT8 * next, UINT8 length, UINT8 depth)
{
	if (length <= 0 || depth <= 0)
	{
		return _parent;
	}

	if (*next >= 26)
	{
		return 0;
	}

	// warning: not thread safe, parent become N/A when tree_phrase changed
	MEOW_PHRASETREE_NODE * parent = &tree_phrase[_parent];

	// children should not be 0 because 0 is root
	if (parent->children == 0)
	{
		MEOW_PHRASETREE_NODE cache;
		cache.children = 0;
		parent->children = tree_phrase.size();
		for (unsigned int i = 0; i < 26; i++)
		{
			tree_phrase.push_back(cache);
		}
		parent = &tree_phrase[_parent];
	}
	return MakeTreeNode(parent->children + *next, next + 1, length - 1, depth - 1);
}
Пример #2
0
void MeowPinyin::LoadDictBasic() {
	{
		HANDLE hfile = CreateFile(L"X:\\Workspaces\\git\\meow\\Tools\\phrase.txt", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
		DWORD size = GetFileSize(hfile, NULL);
		blob_phrase = HeapAlloc(GetProcessHeap(), NULL, size);
		DWORD tmp;
		ReadFile(hfile, blob_phrase, size, &tmp, NULL);
		if (tmp != size) { return; }
		WCHAR * offset = ((WCHAR *)blob_phrase + 1);
		DWORD length = size / 2 - 1;
		table_phrase.clear();
		table_phrase.reserve(445494);
		unsigned int index = 0;
		for (unsigned int i = 0; i < length; i++) {
			if (offset[i] == L'\n') {
				offset[i] = L'\0';
				MEOW_PHRASE_NODE mpn;
				mpn.length = i - index;
				mpn.phrase = offset + index;
				table_phrase.push_back(mpn);
				index = i + 1;
			}
		}
		//HeapFree(GetProcessHeap(), NULL, blob_phrase);
		CloseHandle(hfile);
	}

	MEOW_PHRASETREE_NODE root;
	root.children = 0;
	tree_phrase.reserve(311073);
	tree_phrase.push_back(root);


	UINT32 length = table_phrase.size();
	for (unsigned int i = 0; i < length; i++) {
		UINT8 path[4] = { 0 };
		for (unsigned int j = 0; j < 4; j++) {
			if (j < table_phrase[i].length) {
				path[j] = GetCharTreeID(table_phrase[i].phrase[j]);
			}
			else {
				break;
			}
		}
		UINT32 node = MakeTreeNode(0, path, table_phrase[i].length, 4);
		tree_phrase[node].phrases.push_back(i);
	}


	length = tree_phrase.size();
	UINT32 max = 0;
	for (unsigned int i = 0; i < length; i++) {
		UINT32 tmp = tree_phrase[i].phrases.size();
		if (tmp > max) {
			max = tmp;
		}
	}
}