浅谈数据结构与构建哈夫曼树

数据结构是什么?一开始听到这个名词的时候,觉得一听就深奥难懂。细细一想,“数据结构”,顾名思义就是数据的结构,是计算机存储数据时用的结构。后来学习这门课,才明白数据结构和效率是密切相关的,编写程序的人要让计算机更加高效的工作,这就涉及到算法。所以我觉得数据结构与算法是密切相关的。
不管是什么语言,似乎学习过程中都有一个必不可少的步骤,就是排序。什么冒泡排序,选择排序,快速排序,堆排序。刚开始总有不解,排序干嘛呢?其实这是检验数据结构和算法最好的例子,如果是一百万个数字,如果用冒泡估计得排上好久了。
不同的排序方法,是用数组,链表,堆栈还是图?这又有不同的效率。所以,我觉得数据结构入门容易,用的得心应手可不是件简单的事情。
前几天写了哈夫曼树。写哈夫曼树,第一步就是读取文件,按字节读取文件,存入到数组队列中;第二步是统计频度,将频度存入另一个数组队列;第三步是对频度进行排序,第四步就是建树了。以下是源代码
/*
* 读文件的方法,将读取到的字节存入数组队列list中
*/
public void readfile() throws IOException{
FileInputStream file = new FileInputStream("file/newtext.txt");
while(file.available()>0){
int i=file.read();
list.add(i);

}
}

/*
* 统计频度的方法,将频度存入另外一个数组队列l中
*/
public void count(){
int count[] = new int[list.size()];
//给数组赋初值为1
for(int i = 0;i<count.length;i++){
count[i]=1;
}
for(int i=0;i<list.size();i++){
for(int j=i+1;j<list.size();j++){
if(list.get(i).equals(list.get(j))){
count[i]++;
list.alter(j, -1);
}
}
for(int m=i+1;m<list.size();m++){
if(list.get(m).equals(-1)){
list.remove(m);
}
}
HaffmanNode node = new HaffmanNode(list.get(i),count[i]);
l.add(node);//将次数存入数组队列中
}

}

/*
* 排序方法,选择排序
*/
public void sort(){
for (int j = 0; j< l.size() - 1; j++) {
for (int t = j + 1; t < l.size(); t++) {
if (l.get(t).getweight() <l.get(j).getweight()) {
l.swap(j, t);
}
}
}

}



/*
* 建树的方法
*/
public void createTree(){
while(l.size()>1){
int temp = l.get(0).getweight()+l.get(1).getweight();
HaffmanNode node = new HaffmanNode(0,temp);
node.setleft(l.get(0));
node.setright(l.get(1));
l.add(node);
l.remove(0);
l.remove(0);
sort();
System.out.println("*"+node.getleft().getweight());
System.out.println("#"+node.getright().getweight());
System.out.println(node.getweight());
}
}

哈夫曼树就建好了,我看了一下别人的,有的用图,有的用链表。我写的确实有些麻烦,办法也不够好,但是都是自己想出来的,还会学习其他办法,使用更高效的方法解决问题。

你可能感兴趣的:(数据结构,哈夫曼树,java入门)