天方夜谈_数据结构

之前,在选修的课程选了我的第一门程序设计语言《Java程序设计语言》,现在并没有学的很透彻,大致了解!而后到了大二,开设的《数据结构》的课程,只不过是用C/C++语言来实现的,THE IMPORTANT QUESTION IS我一直没有明白数据结构是一门什么样的课程,只是跌跌撞撞的进了这个门,然后发现其中还是有很多有趣的事情,比如各种各样的算法。

[参考]

1.《Data Structures Outside In with Java》@ author by Sech Venugopal

2.《An Introduction to the Analysis of Algorithms》@author by [美]Robert Sedgewick [法] Philippe Flajolet




该书的首先回顾了Java的很多基础知识,细致的回顾了面向对象编程的特点。关于java的基础知识可以 http://www.runoob.com/java/java-tutorial.html 了解。

我就直接从Venugopal的数据结构部分开始学习。

1.数据结构概观

百度百科:http://baike.baidu.com/link?url=D5sKgDLIBKaVubTILMCrHS0LpTYJwg-VTg6FeZnOIBIPtydXzTNADAUoyXnImndtbxP4nPV0jj_zoOjc5ryEx_4uRQRug3lU40_6qG1y0oUkYQHiMxdNcWU3rlaIJlyb

2.算法的效率

这个部分我打算从图书馆新借来的《算法分析导论》着重小结。

此处暂代更新

3.线性数据结构

  3.1无序列表list

在战场上杀不死的敌人,永远也别想打败他,他就像幽灵横亘在你失败的田地上。



大一下学期,接触到Java程序设计语言,时至今日,才越发觉得知识与技术的海洋是多么多么的浩瀚.......如果说编程语言的一个宏大愿望,没有别的,除了改变世界。

谈到Java,就一定会想到它的那个大家族——类(累)族!我认识Class有一段时间了,我一直认为Class是独处幽灵世界的魔,有着变换莫测的成员函数(方法),随意声明的成员。List是其中一个类,List很想爱德华**世,无序也自然,认识它从一个实例开始:日常收支。

3.2有序列表list

3.3队列Queue  

"我在想Y的时候不能想X....."

什么叫做Queue(队列)?”队列是项的集合,对于每一项x和y,如果x在y之前离开对头,那么x一定在y之前进入队列——Sesh·Venugopal“。生活中最形象的一个例子是:排队服务。先来的人先排队先接受服务,这种方式也叫做FIFO(first-in,first-out)。也叫做变态版的”先下手为强“。

我们希望这个Queue类具有一些操作,能够更好的为我们服务嘛:

Class structures.linear.Queue

//构造器:创建一个新的空队列
        Queue(){}

        void enqueue(T item){}  //把指定项添加到这个队列的队尾
        T dequeue(){}     /*删除并返回这个队列的对头的项,如果队列为空的话,那就抛出NoSuchElementException */
        int size(){}     //返回这个队列的项数
        boolean isEmpty(){}    //判断这个队列是否为空队列
        int pisitionOf(T item){} //返回指定项在队列中的位置,若不存在则返回null
        void clear(){}   //删除这个队列的所有项,清空项
        void remove(T item){} //移除项中的item指定项
        void removeAll(T item){}  /*移除队列中所有的指定项,如果不存在,则抛出NoSucnElementException*/
        T first(){}  //返回队列的第一项,即队头。空队列则返回null
        T next(){} //返回队列的下一项,到达队尾则返回null

方法的运行时间,队列的基本操作就是在队列的头尾执行,因此一个高效实现将维护对队头队尾的直接引用,使这些位置可以一次执行,则时间复杂度为O(1),对于返回搜索项的位置,移除项其都要遍历整个队列,则为O(n)。

现在我们来模拟一下打印机的工作原理:

打印第一个文件——>打印完毕——>打印第二个文件········打印第n个文件——>打印结束

package printQueue;

public class fileJob {
     String file;
     int id;
     String owner;

     fileJob(String owner,int id,String file){
         this.file=file;
         this.owner=owner;
         this.id=id;
     }
     public String toString(){
         return new String(owner+"  "+id+"  "+file);
     }
     public boolean equals(Object other){
         if(other!=null&&other instanceof fileJob){
             fileJob another=(fileJob)other;
             return id==another.id;
         }
     return false;
     }
}
     //将打印的文件做成一个类,然后用这个类的实例化对象进行操作
package printQueue;

/*
这几个类继承fileJob类,主要是重写了比较方法,按照不用的比较参数,进行匹配
*/

public class ownerJob extends fileJob {

    ownerJob(String owner, int id, String file) {
        super(owner, id, file);
    }
    public boolean equals(Object other){
        if(other!=null&&other instanceof fileJob){
            fileJob another=(fileJob)other;
            return (owner.equals(another.owner));
        }
        return false;
    }
}
class idowner extends fileJob{

    idowner(String owner, int id, String file) {
        super(owner, id, file);
    }
    public boolean equals(Object other){
        if(other!=null&&other instanceof fileJob){
            fileJob another=(fileJob)other;
            return (id==another.id)&&(owner.equals(another.owner));
        }
        return false;
    }
}
package printQueue;

import java.util.*;
import java.io.*;
import structrues.linear.Queue;  //导入后面建立的类Queue类

public class printQueue{

   Queue<fileJob> printQ;
    public printQueue(){
        printQ=new Queue<fileJob>();
    }                                                     //实例化对象

    public void lqr(String owner,int id,String file){
        printQ.enqueue(new fileJob(owner,id,file));
    }
                                                          //添加入队列
    public void lpq(){
        fileJob job=printQ.first();
        while(job!=null){
            System.out.println(job);
            job=printQ.next();
        }
    }                                                //遍历输入队列中所有的项

   //下面几个就是对队列进行出队列和删除队列中的项的操作

    public void lprm(String owner,int idjob){
        if(printQ.isEmpty()){
            throw new NoSuchElementException();
        }
        //删除所有与id相同的项
        printQ.remove(new idowner(owner,idjob,null));
    }
    public void lprm(String owner){
        if(printQ.isEmpty()){
            throw new NoSuchElementException();
        }
        fileJob job = printQ.first();
        if(owner.equals(job.owner)){
            printQ.dequeue();
        }
        else{
            throw new NoSuchElementException();
        }
    }
    public void lprmAll(String owner){
        if(printQ.isEmpty()){
            throw new NoSuchElementException();
        }
        printQ.removeAll(new ownerJob(owner,0,null));
    }
}
package structrues.linear;

import java.util.Collection;
import java.util.LinkedList;
import java.util.NoSuchElementException;

import printQueue.fileJob;

/*类Queue的实现,主要是用了一个LinkedList类,ListedList类的具体实现设计到底层的算法
*/

public class Queue<T> {
     LinkedList<T> list;
     int cursor;

    public Queue(){
        list=new LinkedList<T>();
        cursor=-1;
    }
    public void enqueue(T item){
        list.add(item);
    }  //把指定项添加到这个队列的队尾
    public T dequeue(){
        if(list.isEmpty()){
            throw new NoSuchElementException();
        }
        return list.remove(0);

    }     /*删除并返回这个队列的对头的项,如果队列为空的话,那就抛出NoSuchElementException */
   public int size(){
        return list.size();
    }     //返回这个队列的项数
    public boolean isEmpty(){
        return list.isEmpty();
    }    //判断这个队列是否为空队列
    public int pisitionOf(T item){
        return list.indexOf(item);
    } //返回指定项在队列中的位置,若不存在则返回null
    public void clear(){
        list.clear();
    }   //删除这个队列的所有项,清空项
    public void remove(T item){
        list.remove(item);
    } //移除项中的item指定项
    public void removeAll(T item){
        list.removeAll((Collection<?>) item);
    }  /*移除队列中所有的指定项,如果不存在,则抛出NoSucnElementException*/
    public T first(){
      if(list.size() == 0){return null;}
      cursor = 0;
      return list.get(cursor);
    }  //返回队列的第一项,即队头。空队列则返回null
    public T next(){
        if(list.size() == 0 || cursor == (list.size()-1)){
            return null;
        }
        cursor++;
        return list.get(cursor);
    } //返回队列的下一项,到达队尾则返回null
}

到了最后,完成测试类:

package printQueue;
public class mainText {

    public static void main(String[] args) {
       printQueue pq=new printQueue();
       pq.lqr("小二",001,"第一个文件");
       pq.lqr("张三",002,"第二个文件");
       pq.lqr("李四",003,"第三个文件");
       pq.lqr("王二麻子",004,"第四个文件");
       pq.lqr("老王",005,"第五个文件");
       System.out.println("运行出来的结果还是蛮不错的嘛");
       System.out.println("需要打印的文件已经按照好顺序准备打印");
       System.out.println();
       pq.lpq();
    }
}

真的,对于才开始解除java,一开始理解这样的编程过程肯定是有点难的。实际上对类成员的操作一直是java这类面向对象编程的特点。真正理解类才发现写代码“累” 。关于Queue我们还可以做的更多.......

3.4  栈Stack

3.5  二叉树和普通书 binaryTree and normalTree

3.6  堆Heap

3.7  散列表Hashmap

3.8  图Graph

3.9  递归算法

4.0  排序算法

时间: 2024-10-12 11:51:01

天方夜谈_数据结构的相关文章

天方夜谈_从菜鸟建起网站

本篇随笔大都出自<Html5+CSS3+jQuery>@by 清华大学出版社. 开始絮叨: 听过一句话:现在80%,90%的人都会建网站.     在几个月前,我就属于那10%,20%中的一个人.为什么想要学着建网站,首先吧.我觉得以后建一个自己的博客,不会有广告,是一件很酷的事情!     开始学css样式表.想要把网站做的很美观,那就必须要熟练CSS样式,对网站的风格进行设计.一般的书都应该从最简单的字体控制讲,我也不去copy了,从css动态效果小结吧.     主要使用的是transf

天方夜谈_PHP是世界上最好的语言

因为一无所知,接到学校建设网站的项目,特意学起了建设网站的知识,H5技术基本可以实现网页布局,稍加动感.接着学世界上最好的语言--PHP. 看到这个梗https://www.zhihu.com/question/26498147,在知乎上已经笑喷!低级趣味的一个翻译:PHP--看黄片?本来学JSP的,因为之前有一定的Java基础,上手快.但是我就没明白我们项目老师叫:去学PHP--(哈哈)世界上最好的语言. 当然了每一种语言的基础知识都是大同小异,比如:变量(PHP中还有几个supergloba

浅谈PHP数据结构之栈

今天開始进阶自己的PHP,首先一切的编程语言都须要修炼自己的"内功",何为程序猿的"内功",我想大概就是数据结构和算法了吧 .毕竟是灵魂,是普通程序猿到高级程序猿的进阶. 不多说.直接说主题--"栈". 什么是栈,所谓栈就是遵循"后进先出"的原则. 先进栈的最后出栈. 用PHP实现栈无需考虑栈溢出的情况,相对来说比較easy实现,例如以下是经过学习和參考后的代码. <?php class Stack{ private $

目录_数据结构

1.数据结构_总结 2.数据结构_树与二叉树总结 3.数据结构_图总结 4.数据结构_排序总结 1内链2.3.4.

伴雨夜谈【即便大雨倾盆,也无法击起心中的波澜】

昨天下午1点到自己写这篇文章,这场雨已经持续了30多个小时了,曾经不止一次说过自己喜欢这种下雨的天气,现在我还是想说:‘我喜欢雨天,因为雨天总会让我的心平静到不起一点波澜’. [致天蝎座的我们]:http://www.duomi.com/dmplist/779516094409868216 听着别人收集的音乐,因为第一首曲俘获了自己的心,这种感觉真的很好.看着外面的树随风飘扬,雨打在窗户上的声音也是一首美妙的曲.很久都没将自己置于这种环境中了,扬声器里面旋律.雨打的曲.风演绎出的MV和屏幕上不断

nginx源码学习_数据结构(ngx_int_t)

nginx中关于整型的数据结构位于src/core/ngx_config.h中 结构比较简单,就是一个typedef的操作,具体如下: 1 typedef intptr_t ngx_int_t; 2 typedef uintptr_t ngx_uint_t; 3 typedef intptr_t ngx_flag_t; 里面的intptr_t和uintptr_t的定义位于/usr/include/stdint.h中 1 /* Types for `void *' pointers. */ 2 #

浅谈Java数据结构和算法

今天的突然看集合底层的时候发现了好多算法和数据结构.再次就比较一下和汇总一下. 数据结构分类:线性结构和非线性结构 问题一: 什么是线性和非线性: 我个人的理解是:数据结构中线性结构指的是数据元素之间存在着"一对一"的线性关系的数据结构: 线性结构包括:数组,链表,队列,栈: 非线性结构包括:树,图,表: 详解: 一.线性结构 1.数组 特点:我们都知道数组中的元素在内存中连续存储的,可以根据是下标快速访问元素,因此,查询速度很快,然而插入和删除时,需要对元素移动空间,比较慢. 数组使

swift基础_数据结构

哇塞!swift里面的数据结构是这样的,那是一个简洁啊,不多说代码拿来: import Foundation print("Hello, World!") var p1 = 100 //String就是swift里面的类 字符串 let p2 = "value is "+String(p1) print("p2 is \(p2)") var p3 = ["iOS","android","WP&qu

Java面向对象_数据结构之链表

链表:是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里村到下一个节点的指针. 在链表数据结构中,需要使用到递归算法.递归算法是一种直接或间接地调用自身算法的过程. 1 public class Practice14 { 2 3 public static void main(String[] args) { 4 // TODO Auto-generated method stub 5 jiecheng(5); 6 System.out.println(j