Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit a826c48

Browse files
【added】一个题目:寻找第k大。以及哈夫曼思想。
1 parent c135b5b commit a826c48

File tree

5 files changed

+168
-5
lines changed

5 files changed

+168
-5
lines changed

‎README.md

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1-
## 本系列会把我所学的基本数据结构与算法代码全部分块写出来。后期还会把相关的问题补充,大家一起来讨论咯!!
1+
## 本系列会把我所学的基本数据结构与算法代码全部分块写出来。后期还会把相关的题目补充,大家一起来讨论咯!!
22
### 目的:让自己和大家更容易查找以及阅读一些前人积累下来的程序设计基础和灵魂。
3-
#### 队列往后就用纯链式写了吧,这个相对难理解。(其实是想偷懒,,,)
4-
### 本系列说明:一开始会针对每个基本数据结构与算法罗列出代码块,并略为讲解(并会附上完整例子,c和Java版本都有)。等完成这些基本代码的积累后,我会开启针对一些题目结合数据结构进行详细分析的系列。Let's go!!!
3+
4+
5+
#### 本系列说明:一开始会针对每个基本数据结构与算法罗列出代码块,并略为讲解(并会附上完整例子,c和Java版本都有)。等完成这些基本代码的总结后,我会开启针对一些题目结合数据结构进行详细分析的系列。Let's go!!!
56
***
6-
### 使用姿势:打开txt文件,复制到你的编译器运行即可。
7+
### **使用姿势**:打开txt文件,复制到你的编译器运行即可。
78
***
89
## 联系方式:
9-
### 邮箱:jackfrost@fuzhufuzhu.com
10+
### 邮箱:jackfrost@fuzhufuzhu.com
11+
### 想请我喝杯茶吃个蛋挞也是可以的,哈哈!
12+
![这里写图片描述](http://img.blog.csdn.net/20170326230003045?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSmFja19fRnJvc3Q=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
### 【贪心算法】哈夫曼编码问题,是广泛地用于数据文件压缩的十分有效的编码方法。其压缩率通常在20%〜90%之间。哈夫曼编码算法用字符在文件中出现的频率表来建立一个用0,1串表示各字符的最优表示方式。
2+
#### 解决当年数据传输的最优化问题。
3+
### 构建过程:
4+
### 假设有权值叶子结点有:A5,B15,D30,E10,C40
5+
#### (1)按权值排序叶子结点:A5,,E10,B15,D30,C40
6+
#### (2)取头两个最小权值的结点作为一个新节点N1的两个子结点,注意相对较小的是左孩子,此时例子,A为N1的左孩子,E为N1的右孩子。N1新结点权值为5+10=15.
7+
![这里写图片描述](http://img.blog.csdn.net/20170324201634491?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSmFja19fRnJvc3Q=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
8+
#### (3)将N1替换A与E,插入有序序列中,保持从小到大排列。即N1 15,B15,D30,C40
9+
#### (4)重复步骤2,将N1与B作为一个新结点N2的两个子结点。N2权值=15+15=30
10+
#### (5)将N2替换N1与B,插入有序序列中,保持从小到大排列
11+
#### (6)重复步骤2.将N2与D作为一个新节点N3的两个子结点
12+
![这里写图片描述](http://img.blog.csdn.net/20170324202102966?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSmFja19fRnJvc3Q=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
13+
#### (7)将N3替换N2与D,插入有序序列中,保持从小到大排列
14+
#### (8)重复步骤2.将N3与C作为一个新节点N3的两个子结点。完成哈夫曼树的构建。
15+
![这里写图片描述](http://img.blog.csdn.net/20170324202142536?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSmFja19fRnJvc3Q=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
16+
![这里写图片描述](http://img.blog.csdn.net/20170324202223708?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSmFja19fRnJvc3Q=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
17+
***
18+
### 应用:
19+
#### 传输的是一连串的字母,我们先用权值分配好他来构建最优哈夫曼树。如下图左。
20+
![这里写图片描述](http://img.blog.csdn.net/20170324203110307?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSmFja19fRnJvc3Q=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
21+
### 然后!规定哈夫曼树的左分支代表0,右分支代表1,则从根结点到叶子结点所经过的路径分支组成的0和1序列便为该结点对应字符的编码。这就是哈夫曼编码!!如上图右。
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.fuzhu.array;
2+
3+
import java.util.PriorityQueue;
4+
5+
/**
6+
* Created by ${������} on 2017年3月26日.
7+
*/
8+
public class TestPriorityQueue {
9+
public static void main(String[] args) {
10+
PriorityQueue<Integer> pq = new PriorityQueue(3);
11+
int[] array = {
12+
9, 1, 5, 3, 5, 2, 6, 8, 7, 6
13+
};
14+
for (int i = 0; i < array.length; i++) {
15+
pq.offer(array[i]);
16+
System.out.print("\n");
17+
Object[] a =pq.toArray();
18+
for (int j =0;j<a.length;j++){
19+
System.out.print(a[j]);
20+
}
21+
}
22+
}
23+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.fuzhu.array;
2+
3+
import java.util.PriorityQueue;
4+
5+
/**
6+
* Created by ${������} on 2017年3月26日.
7+
*/
8+
/*
9+
����˼·���д������С��������
10+
С����˼·������һ��k��С��С���ѣ����������ȫ��װ��ȥ����װ�߱Ƚϣ����ʼ�ջᱻ�������棬����С�Ļᱻ�ŵ��Ѷ���������װ��֮�����ǾͿ���ȷ������k�����С���ѶѶ���
11+
�����˼·������һ��k��С�Ĵ���ѣ����������ȫ��װ��ȥ����װ�߱Ƚϣ�С��ʼ�ջᱻ�������棬��ÿ�η�����ɦ�򣬶�������Ѵ������������档����װ��֮�����ǾͿ���ȷ������k����ڴ���ѶѶ��l�
12+
*/
13+
public class HeapSearchNumData {
14+
public static int findLeast(int[] nums, int k) {
15+
PriorityQueue<Integer> q = new PriorityQueue<Integer>(k);//һ���������ȼ��ѵļ������ȼ�����
16+
for (int i : nums) {
17+
q.offer(i);//�������������Զ�����
18+
19+
if (q.size() > k) {
20+
q.poll();//�������Ƴ��˶��е�ͷ��Ҳ���ǰѶѶ����Ǹ�����ȥ��
21+
}
22+
}
23+
24+
return q.peek();//������飬���Ƴ�
25+
}
26+
public static void main(String[] args) {
27+
int[] array = {
28+
9, 1, 5, 3, 5, 2, 6, 8, 7, 6
29+
};
30+
int k=findLeast(array,4);
31+
System.out.print(k);
32+
System.out.print("\n");
33+
for(int i=0;i<10;i++){
34+
System.out.print(array[i]+" ");
35+
}
36+
System.out.print("\n");
37+
for(int i=0;i<10;i++){
38+
if (k==array[i]){
39+
System.out.print(" �"+i+" ");
40+
}
41+
}
42+
}
43+
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package com.fuzhu.array;
2+
3+
/**
4+
* Created by ${������} on 2017年3月25日.
5+
* ��L·������
6+
* �ҳ�һ�����������е�k�������
7+
������±�
8+
�������������ظ�
9+
�ظ�������ȫ�����
10+
*/
11+
/*
12+
����˼�룺���ÿ���˼�룬�ȼوٴ��Ӵ�С��������Ŧ����Ŧ��Ѵ�С�ֿ��������ߣ�����Ŧ�±����kɦ��
13+
������kλ������߻��ұߣ�Ҳ����������С���ŵ���������߻��ұ��l���ô�Ǹ���Ŧ����Ҫ�ҵĵ�kλ��
14+
*/
15+
public class SearchNumData {
16+
/*
17+
nΪ���鳤��
18+
kΪҪ���ҵĵ�k��
19+
*/
20+
public static int findKth(int[] a, int n, int K) {
21+
return findKth(a, 0, n - 1, K);
22+
}
23+
24+
/*
25+
startΪ�������λ
26+
endΪ�������λ
27+
*/
28+
public static int findKth(int[] a, int start, int end, int k) {
29+
//�Ƚ���һ�ο��ţ�ȡ����Ŧ
30+
int pivot = partation(a, start, end);
31+
//pivot-start+1��ʾ���ŵ�ǰ���Ԫ�صĸ������������ᣩ
32+
//������һ�κ󣬾ͻ��������ߣ��������ߣ�С�����ұ�
33+
if (k == pivot - start + 1){
34+
return a[pivot];
35+
} else if (k > pivot - start + 1) {//˵����k���Ԫ���ں��Σ�����������飬start=pivot+1��k-��pivot-start+1����Ϊjô�������£���һ�£�������Ȼ����飬����Ļ�����������ĵ�k�󣬵�һ�ο�����Ŧ��ɦ���Ѿ��Ѵ�ķ��ұ��l�
36+
return findKth(a, pivot + 1, end, k - pivot + start - 1);
37+
} else{//���k���Ԫ����ǰ��Σ�����end=pivot-1
38+
return findKth(a, start, pivot - 1, k);
39+
}
40+
}
41+
//���ţ�����Ŧ���Ӵ�С����
42+
public static int partation(int[] a, int low, int high) {
43+
int key = a[low];
44+
while (low < high) {
45+
while (low < high && a[high] <= key)
46+
high--;
47+
a[low] = a[high];
48+
while (low < high && a[low] >= key)
49+
low++;
50+
a[high] = a[low];
51+
}
52+
a[low] = key;
53+
return low;
54+
}
55+
public static void main(String[] args) {
56+
int[] array = {
57+
9, 1, 5, 3, 5, 2, 6, 8, 7, 6
58+
};
59+
int [] array2 = array.clone();
60+
int k=findKth(array,array.length,4);
61+
System.out.print(k);
62+
System.out.print("\n");
63+
for(int i=0;i<10;i++){
64+
System.out.print(array[i]+" ");
65+
}
66+
System.out.print("\n");
67+
for(int i=0;i<10;i++){
68+
if (k==array2[i]){
69+
System.out.print(" �"+i+" ");
70+
}
71+
}
72+
}
73+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /