贪心算法-活动选择问题-递归实现(java)

package com.wanali.greedy_algorithm;

import java.util.ArrayList;
import java.util.List;
/**
 * 活动选择问题(贪心算法-递归实现)
 * 在每一步做出当前看来最好的选择,即做出局部最优选择,该算法找到的解不一定是最优解
 * @author wan_ys
 *
 * 2019年1月10日下午3:30:16
 */
public class RecursiveActivitySelector {
	public static void main(String[] args) {
		int[] s = new int[] { 1, 3, 0, 5, 3, 5, 6, 8, 8, 2, 12 };
		int[] f = new int[] { 4, 5, 6, 7, 9, 9, 10, 11, 12, 14, 16 };
		System.out.println(acivitySelector(s, f, 0, s.length - 1));
	}
	//定义一个list用于存放已选的活动
	static List<Integer> list = new ArrayList<Integer>();
	/**
	 * 
	 * @param s 活动开始时间 
	 * @param f 活动结束时间
	 * @param i 在贪心算法选择了第i个活动之后,从第i个活动之后继续找合适的
	 * @param n 最后一个活动的下标位置
	 * @return
	 */
	static List<Integer> acivitySelector(int[] s, int[] f, int i, int n) {
		// 假设活动的结束时间已经从小到大排好
		if (i==0) {//根据贪心算法的贪心选择性质,肯定会选择第一个活动
			list.add(i+1);
		}
		//往后找f[i]<=s[j]的活动
		int j = i + 1;
		//没有找到满足f[i]<=s[j]的活动
		while (j <= n && f[i] > s[j]) {
			j++;
		}
		//找到一个满足f[i]<=s[j]的活动,添加到list
		if (j <= n) {
			list.add(j + 1);//j+1对应活动的编号
			acivitySelector(s, f, j, n);//继续向后找满足条件的活动,递归实现
		}
		return list;
	}

}

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
哈夫曼编码是一种压缩算法,可以将数据压缩到较小的空间。贪心算法实现哈夫曼编码的一种常用方法。 下面是Java代码实现哈夫曼编码的过程: 首先,我们需要定义一个Node类来表示哈夫曼树的节点。 ``` class Node implements Comparable<Node> { int frequency; char data; Node leftChild; Node rightChild; // Constructor public Node(int frequency, char data) { this.frequency = frequency; this.data = data; } // Compare method for sorting nodes public int compareTo(Node otherNode) { return Integer.compare(this.frequency, otherNode.frequency); } } ``` 然后,我们可以定义一个函数来生成哈夫曼树。 ``` public static Node buildHuffmanTree(int[] frequencies, char[] characters) { PriorityQueue<Node> queue = new PriorityQueue<>(); for (int i = 0; i < characters.length; i++) { queue.offer(new Node(frequencies[i], characters[i])); } while (queue.size() > 1) { Node left = queue.poll(); Node right = queue.poll(); Node parent = new Node(left.frequency + right.frequency, '-'); parent.leftChild = left; parent.rightChild = right; queue.offer(parent); } return queue.poll(); } ``` 接下来,我们可以定义一个递归函数来遍历哈夫曼树并生成哈夫曼编码。 ``` public static void generateCodes(Node node, String code, Map<Character, String> map) { if (node == null) { return; } if (node.data != '-') { map.put(node.data, code); } generateCodes(node.leftChild, code + "0", map); generateCodes(node.rightChild, code + "1", map); } ``` 最后,我们可以定义一个函数来调用上述函数并返回哈夫曼编码的映射表。 ``` public static Map<Character, String> generateHuffmanCodes(int[] frequencies, char[] characters) { Node root = buildHuffmanTree(frequencies, characters); Map<Character, String> map = new HashMap<>(); generateCodes(root, "", map); return map; } ``` 使用示例: ``` int[] frequencies = {5, 9, 12, 13, 16, 45}; char[] characters = {'a', 'b', 'c', 'd', 'e', 'f'}; Map<Character, String> huffmanCodes = generateHuffmanCodes(frequencies, characters); for (Map.Entry<Character, String> entry : huffmanCodes.entrySet()) { System.out.println(entry.getKey() + ": " + entry.getValue()); } ``` 输出: ``` a: 1100 b: 1101 c: 100 d: 101 e: 111 f: 0 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值