PTA_数据结构与算法题目集(中文)_7-9 Huffman Codes (30 分)_简洁版解法

  • 题目地址
  • 题目分析:
  1. 我们在分析哈夫曼树建立规则后可知,在所有(n个)数据作为子叶节点时,需且仅需(n-1个)连接点来构成完整的哈夫曼树。故,我们设置一个大小为2*n的结构体数组并使用其中1到2*n-1(共计n + n-1个位子)来建立哈夫曼树。
  2. 每次我们通过线性查找得到2个最小值,并做标记。这时,我们仅仅需要从n+1这个位置开始 记录 最小两值所处位置 直至2*n-1这个位置,而2*n-1这个位置既是我们的头结点。
  3. 每次我们检查学生数据仅仅需要比较min_length的长度段。
  4. 以上的处理针对型较强,仅仅适合这道数据量不多的题目。
  • 我的代码:
    #include
    #include
    #include
    #define INF 0x3f3f3f3f
    
    typedef struct node {
    	int val;
    	int left, right;
    }node, *np;
    np nn;
    int n, m, huf = 0;
    bool mark[126];
    
    void buildHuff(int id)
    {
    	int min1 = INF, min2 = INF, m1=-1, m2=-1;
    	for (int i = 1; i <= id - 1; i++)
    		if (mark[i])
    		{
    			if (nn[i].val < min1)
    			{
    				min2 = min1, m2 = m1;
    				min1 = nn[i].val, m1 = i;
    			}
    			else if (nn[i].val < min2)
    				min2 = nn[i].val, m2 = i;
    		}
    	nn[id].val = min1 + min2;
    	nn[id].left = m1, nn[id].right = m2;
    	mark[m1] = mark[m2] = false;
    }
    int getHuff(int id, int level)
    {
    	if (id >= 1 && id <= n) return nn[id].val*level;
    	return getHuff(nn[id].left, level + 1) + getHuff(nn[id].right, level + 1);
    }
    
    int main()
    {
    	scanf("%d", &n); getchar();
    	nn = (np)malloc(sizeof(node) * 2 * n);//nice method
    	for (int i = 1, t; i <= n; i++)
    	{
    		getchar();  getchar();
    		scanf("%d", &t);
    		nn[i].val = t, nn[i].left = nn[i].right = -1;
    	}
    	for (int i = 0; i < 126; i++)
    		mark[i] = true;
    	for (int i = n + 1; i < 2 * n; i++)
    		buildHuff(i);
    
    	int huf = getHuff(2 * n - 1, 0);
    	scanf("%d", &m); getchar();
    	for (int i = 0; i < m; i++)
    	{
    		char cc[63][63] = { {'\0'} };
    		for (int j = 0, cnt; j < n; j++)
    		{
    			char c;
    			cnt = 1;
    			getchar(); getchar();
    			while ((c = getchar()) != '\n')
    				cc[j][cnt++] = c;
    			cc[j][0] = cnt - 1;
    		}
    		int test = 0;
    		for (int i = 0; i < n; i++)
    			test += (int)cc[i][0] * nn[i+1].val;
    		if (test != huf)
    		{
    			printf("%s\n", "No");
    			continue;
    		}
    
    		bool flag = true;
    		for (int i = 0; i < n; i++)
    			for (int j = 0; j < n; j++)
    			{
    				int len = cc[i][0] > cc[j][0] ? cc[j][0] : cc[i][0];
    				if (flag && i != j && !memcmp(cc[i] + 1, cc[j] + 1, len))
    				{
    					printf("%s\n", "No");
    					flag = false;
    				}
    			}
    		if (flag) printf("%s\n", "Yes");
    	}
    
    	return 0;
    }

     

你可能感兴趣的:(PTA_数据结构与算法题目集(中文)_7-9 Huffman Codes (30 分)_简洁版解法)