美文网首页
大数据算法系列3:基本数据结构及应用

大数据算法系列3:基本数据结构及应用

作者: 只是甲 | 来源:发表于2022-10-18 16:14 被阅读0次

一. 数据结构

image.png

1.1 指针的原理

image.png

1.2 链表

image.png

链表的基本操作:

image.png

链表 VS 数组:
数组的长度是固定的,而且存储二项式很麻烦,所以底层用链表比较多。

image.png

栈和队列 都是通过 链表或数组来实现的

二. 栈

image.png

栈的应用:

  1. 函数或子程序调用
  2. 博弈树遍历
  3. 编辑器undo实现

三. 队列

image.png

四. 栈和栈实战

4.1 栈实战

http://poj.org/problem?id=2559

image.png
package com.suanfa.栈;

import java.util.Stack;

public class 最大矩形面积 {
    public static void main(String[] args) {
        int[] arr1 = {8,7,6,5,4,3,2};
        int rst = 0;
        rst = largestRectangleArea(arr1);
        System.out.println(rst);
        //bubbleSort2(arr1);
    }

    /**
     * 遍历数组
     * 1.栈为空则入栈
     * 2.若h[i]>=栈顶元素,入栈
     * 3.若h[i]<栈顶元素,则开始出栈计算面积,并将最后出栈的h[x]值改为h[i]再重新入栈
     *
     * @param heights 数组,本例会创建个新数组,在数组最后一个位置补个高度为0的图
     * @return 最大面积值
     */
    public static int largestRectangleArea(int[] heights) {
        int max = 0;
        Stack<Integer> s = new Stack<>();
        int [] h = new int[heights.length + 1];
        for (int i =0; i < h.length; i++) {
            h[i] = i == heights.length ? 0 : heights[i];
            //System.out.println("i="+i);
            //System.out.println("h[i]=" + h[i]);
            if (s.empty()) {
                //空栈直接入栈
                s.push( i );
                continue;
            }

            //System.out.println("h[s.peek()]:"+h[s.peek()]);
            if (h[i] < h[s.peek()]) {
                //遇到小于栈顶的值,开始出栈,查找最大面积
                int top = 0;
                while (!s.empty() && h[s.peek()] > h[i]) {
                    //top等于栈移出的元素的值
                    top = s.pop();
                    max = Math.max(( i - top ) * h[top], max);
                    //System.out.println("top="+top);
                    //System.out.println("h[top]="+h[top]);
                    //System.out.println("max="+max);

                }
                //将最后出栈的高度改为h[i]重新入栈
                h[top] = h[i];
                System.out.println("top=" + top + ",");
                s.push( top );
                s.push( i );
            } else {
                s.push( i );
            }

            /*for (Integer s1 : s) {
                System.out.print("栈:"+s1+",");
                System.out.println();
            }*/
            //System.out.println("===================================");

        }
        return max;
    }
}

4.2 队列实战

http://poj.org/problem?id=2259

题意:
维护一个team queue,每次入队列,如果跟这个元素在一个队里的元素已经在这个大队里,那么这个元素可以插到他们队友的后面。给出有几个队以及这些队里面包含的元素,输出要求出队的时候的元素。

分析:
按照题目输入的顺序,给队编号。因为属于同一个队的可以插队,所以在队列中,同一个队的必然在一起。所以一个总的队列,只用记录下来队伍的编号就可以了,再记录下来每个队伍中的顺序。

代码:

package com.suanfa.队列;

import java.util.*;

public class TeamQueue {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        TeamQueue tq = new TeamQueue();
        int count = 1;
        while (true) {
            List<Set<String>> listSet = new ArrayList<Set<String>>();
            List<Queue<String>> listQueue = new ArrayList<Queue<String>>();
            Queue<Integer> indexs = new LinkedList<Integer>();

            int n = sc.nextInt();
            if (n == 0) {
                break;
            }
            for (int i = 0; i < n; i++) {
                int m = sc.nextInt();
                Queue queue = new LinkedList();
                listQueue.add(queue);
                Set<String> set = new HashSet<String>();
                listSet.add(set);
                for (int j = 0; j < m; j++) {
                    listSet.get(i).add(sc.next());
                }
            }
            System.out.println("Scenario #" + count);
            count++;
            while (true) {
                String str = sc.next();
                if (str.equals("ENQUEUE")) {//入队
                    String num = sc.next();
                    tq.add(num, listQueue, listSet, indexs);
                } else if (str.equals("DEQUEUE")) {//出队
                    System.out.println(tq.remove(listQueue, indexs));
                } else if (str.equals("STOP")) {//结束
                    break;
                }
            }
            System.out.println();
        }
    }

    public void add(String num, List<Queue<String>> listQueue, List<Set<String>> listSet, Queue<Integer> indexs) {//入队
        int index = select(listSet, num);
        if (listQueue.get(index).isEmpty()) {
            indexs.add(index);
            listQueue.get(index).add(num);
        } else {
            listQueue.get(index).add(num);
        }

    }

    public String remove(List<Queue<String>> listQueue, Queue<Integer> indexs) {//出队
        while (true) {
            int index = indexs.peek();
            String str = listQueue.get(index).poll();
            if (listQueue.get(index).isEmpty()) {
                indexs.remove();
            }
            return str;
        }
    }


    public int select(List<Set<String>> listSet, String num) {//选队
        for (int i = 0; i < listSet.size(); i++) {
            if (listSet.get(i).contains(num)) {
                return i;
            }
        }
        return -1;
    }
}

参考:

  1. http://www.dataguru.cn/article-5747-1.html

相关文章

  • 大数据算法系列3:基本数据结构及应用

    一. 数据结构 1.1 指针的原理 1.2 链表 链表的基本操作: 链表 VS 数组:数组的长度是固定的,而且存储...

  • 数据结构与算法 - 查找

    数据结构与算法系列文章数据结构与算法 - 时间复杂度数据结构与算法 - 线性表数据结构与算法 - 树形结构数据结构...

  • 数据结构与算法 - 树形结构

    数据结构与算法系列文章数据结构与算法 - 时间复杂度数据结构与算法 - 线性表数据结构与算法 - 树形结构 目录 ...

  • 01. 数据结构与算法绪论

    一、数据结构 1. 什么是数据结构 2. 数据结构的分类 3. 常用的数据结构 4. 数据结构的应用表现 二、算法...

  • IOS开发_数据结构

    1、数据结构; 2、算法; 3、数据结构与算法; 1、数据结构; 1.1 概念: 数据结构:数据结构是计算...

  • 数据结构——介绍

    什么是数据结构 在《数据结构,算法及应用》一书中有这样的解释“数据结构是数据对象,存在与该对象的实例以及组成实例的...

  • 九、哈希表

    这一节记录一下哈希表的学习 持续更新中...数据结构与算法系列博客:一、数据结构与算法概述二、数组及LeetCod...

  • 太实用了!Alibaba内部推出的超全各大厂算法题精解,已被彻底

    算法和数据结构一直以来都是程序员的基本内功。 数据结构可以看作是算法实现的容器,通过一系列特殊结构的数据集合,能够...

  • 基于数据结构和算法的业务应用(一)

    数据结构、算法到底什么?算法如何再业务中应用? 一 概述 1.1 数据结构的概述 1.1.2 概述 数据结构是计算...

  • 数据结构和算法的关系

    数据结构和算法不是并列的关系, 它们构成了层次化的结构. 算法 抽象数据结构 基本数据结构 算法 DP 问题 回溯...

网友评论

      本文标题:大数据算法系列3:基本数据结构及应用

      本文链接:https://www.haomeiwen.com/subject/dlknortx.html