算法--线性结构

一、数据结构

什么是数据结构:数据与数据之间的关系。

数据的存储结构:顺序存储(ArrayList)、链式存储(LinkList)。

数据的逻辑结构:集合结构、线性结构、树形结构、图形结构。

二、算法

算法:解决问题的方法。

算法的特性:输入、输出、有穷、确定性、可行性。

算法的基本要求:正确性、可读性、健壮性、时间复杂度、空间复杂度。

三、线性结构

1、数组

普通数组:类似Java基本类型数组

对象数组:类似ArrayList在对象里面定义一个数组类型的成员变量。

数组中的算法:线性查找和二分法查找。

//线性查找public void queryByIndex(){    int[] arr = new int[]{2,3,4,6,5};    int target = 4;    int index = -1;    for(int i=0;i<arr.length;i++){        if(target == arr[i]){            index = i;            break;        }    }    System.out.println(index)}
//二分法查找,前提是数组的内容是有序的public void queryByMid(){    int[] arr = new int[]{2,3,4,5,6};    int target = 4;    int index = -1;    int begin = 0;    int end = arr.length - 1;    int mid;    while(true){        mid = (begin+end)/2        if(target == arr[mid]){            index = i;            break;        }else if(target > arr[mid]){            end = mid - 1;        }else{            begin = mid + 1;        }        //不加这行会死循环        if(begin >= end){            break;        }    }

    System.out.println(index)}
2、栈

特点:先入后出,可以使用数组对象模拟。

int elements = new int[0];//数组越界空指针异常不考虑public void push(int element){     int[] arr = new int[elements + 1];    int len = elements.length;    for(int i=0;i < len;i++){        arr[i] = elements[i];    }    arr[len] = element;    elements = arr;}//数组越界空指针异常不考虑public int pop(){    int[] arr = new int[elements - 1];    int len = elements.length;    int value = elements[len -1];    for(int i=0;i < len -1;i++){        arr[i] = elements[i];    }    elements = arr;    return value;}
3、队列

特点:先进先出,可以使用数组对象模拟。

int elements = new int[0];//入队数组越界空指针异常不考虑public void add(int element){    int[] arr = new int[elements + 1];    int len = elements.length;    for(int i=0;i < len;i++){        arr[i] = elements[i];    }    arr[len] = element;    elements = arr;}//出队数组越界空指针异常不考虑public int poll(){    int[] arr = new int[elements - 1];    int len = elements.length;    int value = elements[0];    for(int i=0;i < len;i++){        arr[i] = elements[i+1];    }    elements = arr;    return value;}
4、单向链表

特点:一个节点除存储数据以外,还需存储下一个节点的指向。

public class Node{    //节点数据    int data;    //java对象在内存中是地址,可以理解下个节点的地址    Node next;    public Node(int data){        this.data = data;    }    public Node append(Node node){        Node currentNode = this;        while(true){            Node nextNode = currentNode.next;            if(null == nextNode){                break;            }            currentNode = nextNode;        }        //当前节点是可变的,因为循环中重新赋值了        currentNode.next = node;        return this;    }        public Node next(){        return this.next;    }        public int getData(){        return this.data;    }    public boolean isLast(){        if(null == this.next){           return true;         }        return false;    }    //移除也只能移除当前节点的下个节点    public void removeNext(){        Node deleteNode = this.next;        Node newNext = deleteNode.next();        this.next = newNext;    }        //只能插入当前节点后面    public void inset(Node node){        Node next = this.next;        this.next = node;        node.next = next;    }}
5、单项循环链表

特点:和单链表相比,尾节点的下个节点指向首节点,构成一个单向循环。

public class LoopNode{    //节点数据    int data;    //java对象在内存中是地址,可以理解下个节点的地址    Node next = this;    public LoopNode(int data){        this.data = data;    }        public Node next(){        return this.next;    }        public int getData(){        return this.data;    }       //移除也只能移除当前节点的下个节点    public void removeNext(){        Node deleteNode = this.next;        Node newNext = deleteNode.next();        this.next = newNext;    }        //只能插入当前节点后面    public void inset(Node node){        Node next = this.next;        this.next = node;        node.next = next;    }}
6、双向循环链表

特点:由数据、前一个节点和下个节点做成

public class DoubleNode{    DoubleNode pre = this;    DoubleNode next = this;    int data;    public DoubleNode(int data){        this.data = data;    }    //往后增加节点    public void after(DoubleNode node){        //当前节点的下个节点        DoubleNode oldNext = this.next;        //新增的节点        this.next = node;        node.pre = this;                node.next = oldNetx;        oldNext.pre = node;    }}
7、递归

特点:在一个方法或者函数内部调用该方法,记得留出口,不然会栈溢出(StackOverflowError)。

//斐波那契数列 1 1 2 3 5 8 ...public static int test(int i){    if(1 == i || 2 == i){        return 1;    }    return test(i - 1) + test(i - 2);}//汉诺塔/*** 共n个盘子* 开始位置* 中间位置* 目标位置* 无论有多少盘子,都认为只有两个,上面的所有盘子和下面一个盘子。*/public static int test2(int n,char from,char in ,char to){    if(1 == n){       System.out.println("第1个盘子从" + from + "移动到 " + to)    }else{        //移动上面的盘子到中间位置        test2(n-1,from,to,in);        System.out.println("第"+n+"盘子从" + from + "移动到 " + to);        //把上面的所有盘子从中间位置移动到目标位置        test2(n-1,in,from,to);    }}

原文地址:https://www.cnblogs.com/hyf-huangyongfei/p/12515974.html

时间: 2024-10-10 16:13:04

算法--线性结构的相关文章

查找算法--线性结构的查找方法

查找基本概念: 查找又称为检索,指从一批记录中找出满足指定条件的某一记录过程.在日常生活中比如通讯录查找,字典查找等经常使用查找方法:在程序设计中,查找在许多程序中需要占用很多时间,因此,一个好的查找方法可以提高程序的运行速度. 主关键字和次关键字: 在需要查找的数据结构中,每条记录一般包含多个数据域.查找条件一般是给定其中的一个或几个域的值,这些作为查找条件的域成为关键字(KEY),如果关键字可以唯一标示数据结构中的一条记录,则称此关键字(Primary Key):若关键字不能唯一区别各个不同

13. C#数据结构与算法 -- 线性结构

本文中,我们讨论了三个部分的内容: 什么是线性结构,线性结构有哪些特点 . 详细介绍了一个最简单线性结构顺序表,并且通过源代码进行一些的分析. 最后还举了一个例子,让我们更好的理解顺序表. 第一部分:什么是线性结构,线性结构有哪些特点 什么是线性结构,线性结构是最简单.最基本.最常用的数据结构.线性表是线性结构的抽象(Abstract), 线性结构的特点是结构中的数据元素之间存在一对一的线性关系. 这 种一对一的关系指的是数据元素之间的位置关系,即: (1)除第一个位置的数据元素外,其它数据元素

一步一步写算法(之线性结构的处理)

原文:一步一步写算法(之线性结构的处理) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 我们知道,在内存中的空间都是连续的.也就是说,0x00000001下面的地址必然是0x00000002.所以,空间上是不会出现地址的突变的.那什么数据结构类型是连续内部空间呢,其实就是数组,当然也可以是堆.数组有很多优势,它可以在一段连续空间内保存相同类型的数据,并且对这些数据进行管理.所以从这个意义上说,掌握了数组才能说明你数据结构入门了. 那么,

【算法和数据结构】_17_小算法_线性结构:顺序表

/* 本程序用来测试数据结构中的线性结构:顺序表 */ #include <stdio.h> #include <stdlib.h> #define LINEAR_MAX_SIZE 64 struct LinearList { int* List; //顺序表指针 unsigned short int ListLen; //顺序表最大的元素个数 unsigned short int CurrentLen; //顺序表当前元素的个数 }; typedef struct LinearL

数据结构和算法-数据结构-线性结构-栈和队列

 ################################################## """ 三.线性结构 (1)栈 1.定义:栈是一个数据集合,可以理解为只能在一端进行插入或者删除操作的列表. 2.栈的特点:后进先出(last-in,first-out),简称LTFO表 这种数据结构的特点: 就是像是杯子或者是弹夹,电梯, 存储的时候从底部开始,读取的时候从顶部开始,具备这种特点就是栈 就是后进先出, 存储的时候就可以从顺序表或者链表就可以实现, 只让从一

Mooc数据结构-基础和线性结构

1 数据结构 解决问题方法的效率,跟数据的组织方式有关 解决问题方法的效率,跟空间的利用效率有关 解决问题方法的效率,跟算法的巧妙程度有关 数据结构 数据对象在计算机中的组织方式 逻辑结构 物理存储结构 数据对象必定与一系列加在其上的操作相关联 完成这些操作所用的方法就是算法 抽象数据类型(Abstract Data Type) 数据类型 数据对象集 数据集合相关联的操作集 抽象: 描述数据类型的方法不依赖与具体实现 与存放数据的机器无关 与数据存储的物理结构无关 与实现操作的算法和编程语言无关

js数据结构与算法存储结构

数据结构(程序设计=数据结构+算法) 数据结构就是关系,没错,就是数据元素相互之间存在的一种或多种特定关系的集合. 传统上,我们把数据结构分为逻辑结构和物理结构. 逻辑结构:是指数据对象中数据元素之间的相互关系,也是我们今后最需要关注和讨论的问题. 物理结构:是指数据的逻辑结构在计算机中的存储形式. 常用的数据结构有: 数组,队列(queue),堆(heap),栈(stack),链表(linked list ),树(tree),图(graph)和散列表(hash) 栈(stack):运算只在表的

数据结构第二讲:线性结构

参考:浙大数据结构(陈越.何钦铭)课件 1.线性表及其实现 有一个很好的问题可以方便的说明引入链表的好处,那就是一元多项式:f(x) = a0 + a1x + an-1xn-1 + anxn 的表示及运算(两个多项式相加/相减/相乘等),显然我们可以利用数组来解决这个问题,两个多项式相加就是两个数组对应分量相加.但是这引入了一个很严重的问题,如何表示多项式x + 3x2000呢?开这么大的数组明显会造成空间浪费. 解决上面遗留的问题的一个方法是用结构数组按指数大小有序存储,每一个数组元素维护两个

常见的线性结构

目录 前言 数组 数组介绍 自定义数组 实现数组的增删改查方法 动态数组 时间复杂度分析 栈 栈介绍 定义栈接口 基于数组实现栈的基本操作 使用栈实现"括号匹配"问题 队列 队列介绍 定义队列接口 数组队列 循环队列 数组队列和循环队列的性能比较 链表:最基础的动态数据结构 链表介绍 实现链表的增删改查操作 通过自定义链表实现栈 通过自定义链表实现队列 递归 前言 ??本篇博客主要是记录手写这些这数据结构的底层实现,加深对线性结构的理解,实现自己的一个小型数据结构库,也会进行简单的时间