算法与数据结构 Part 1

Posted 小K学大数据

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法与数据结构 Part 1相关的知识,希望对你有一定的参考价值。


介绍

经典面试算法题

字符串匹配问题

  1. 暴力匹配:

    简单,但是效率低

  2. KMP算法

汉诺塔

分治算法

八皇后问题

回溯算法

马塔棋盘

深度优化遍历算法(DFS)+ 贪心算法优化

修路问题

最小生成树 + 普利姆算法

最短路径问题

图 + 弗洛伊德算法

丢手帕问题

单向环形链表


数据结构

线性与非线性结构

线性结构

  1. 最常用的数据结构,数据元素之间是一对一的线性关系

  2. 数组、队列、链表、栈

  3. 两种不同的存储结构:

    • 顺序存储结构(数组)

      存储的元素在内存中是连续的

    • 链式存储结构(链表)

非线形结构

二位数组、多维数组、广义表、数结构、图结构

稀疏数组 SparseArray

基本介绍

当数组中大部分元素为0或者为同一个值的时候,可以使用稀疏数组来保存该数组

  • 处理方法

    1. 记录数组一共有几行几列,有多少个不同的值

    2. 把不同值的元素的行列和值的数据记录到另外的一个小规模的数组中

    原始数组

    0 0 0 0 0
    0 1 0 0 0
    0 0 2 0 0
    0 1 0 0 0
    0 0 0 0 0

    稀疏数组

    5 5 3
    1 1 1
    2 2 2
    3 1 1
    • 第一列记录原始数组的信息
      • sparseArr[0] [0]: 原始数组行
      • sparseArr[0] [1]: 原始数组列
      • sparseArr[0] [2]: 原始数组中不同元素个数
    • 下面每列记录原始数组中各个不同元素的信息
      • sparseArr[i] [0]: 元素所在的行
      • sparseArr[i] [1]: 元素所在的列
      • sparseArr[i] [2]: 元素所在的值
    • 数组大小
      • 原始数组中不同元素的个数+1 * 3

代码实现

  1. 通过原始数组生成稀疏数组
public class SparseArray{
  public static void main(String[] args){
    //定义原始数组
    int arr[][] = new int[5][5];
    arr[1][1] = 1;
    arr[2][2] = 2;
    arr[3][1] = 1;
    
    //遍历原始数组,找出不同元素个数
    int sum = 0;
    for(int i = 0; i < arr.length; i++){
      for(int j = 0; j < arr[i].length; j++){
        if(arr[i][j] != 0){
          sum++;
        }
      }
    }
    
    //初始化稀疏数组
    int[][] sparseArr = new int[sum+1][3];
    
    //把稀疏数组第一行的数据赋值
    sparseArr[0][0] = arr.length;
    sparseArr[0][1] = arr[0].length;
    sparseArr[0][2] = sum;
    //遍历原始数组,把不同元素的指定数据放入稀疏数组
    int count = 0;
    for(int i = 0; i < arr.length; i++){
      for(int j = 0; j < arr[i].length; j++){
        if(arr[i][j] != 0){
          count++;
          sparseArr[count][0] = i;
          sparseArr[count][1] = j;
          sparseArr[count][2] = arr[i][j];
        }
      }
    }
  }
}
  1. 通过稀疏数组还原原始数组
public class OrginalArr{
  public static void main(String[] args){
    //假设已经得到稀疏数组sparseArr
    int[][] orginalArr = new int[sparseArr[0][0]][sparseArr[0][1]];
    //遍历稀疏数组,把不同的值放入原始数组
    for(int i = 1; i < sparseArr.length; i++){
      orginalArr[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
    }
  }
}
  1. 将数组保存到磁盘本地文件并读取恢复

队列 Queue

基本介绍

  1. 有序列表,可以用链表或者数组实现
    • 链表:存储数据不连续
    • 数组:存储数据连续
  2. 先进先出

代码实现

public class ArrayQueue{
  private int maxSize;
  private int front;
  private int rear;
  private int[] queue;
  
  //队列初始化
  public ArrayQueue(int maxQueueSize){
    this.maxSize = maxQueueSize;
    this.front = -1;
    this.rear = -1;
    this.queue = new int[maxQueueSize];
  }
  
  //判断队列是否已满
  public boolean isFull(){
    if (rear == maxSize - 1) {
      return true;
    }
    return false;
  }
  
  //判断队列是否为空
  public boolean ifEmpty(){
    if (rear == front) {
      return true;
    }
    return false;
  }
  
  //向队列中添加数据
  public void addData(int data){
    if (ifFull()){
      System.out.println("队列已满,不能添加数据!");
      return;
    }
    rear++;
    queue[rear] = data;
  }
  
  //从队列中移除数据
  public int getData(){
    if (isEmpty()) {
      throw new RuntimeException("队列为空,不能移除数据!")
    }
    front++;
    return queue[front];
  }
  
  //显示队列中目前的所有数据
  public void showQueue(){
    if (isEmpty()) {
      System.out.println("队列为空,没有数据!");
      return;
    }
    for (int i = 0; i < queue.length; i++){
      System.out.println(queue[i]);
    }
  }
  
  //显示队列中的第一个数据
  public void showHead(){
    if (isEmpty()) {
      System.out.println("队列为空,没有数据!");
      return;
    }
    System.out.println(queue[front+1]);
  }
}


以上是关于算法与数据结构 Part 1的主要内容,如果未能解决你的问题,请参考以下文章

数据结构与算法(Python)——常见数据结构Part4(二叉树)

数据结构与算法(Python)——常见数据结构Part3(队列和循环队列)

数据结构与算法(Python)——常见数据结构Part3(队列和循环队列)

数据结构与算法(Python)——常见数据结构Part2(栈和递归)

数据结构与算法(Python)——常见数据结构Part5(二叉搜索树BST和AVL)

数据结构与算法(Python)——常见数据结构Part5(二叉搜索树BST和AVL)