首页 > 编程语言 >【Java数据结构】---初始数据结构

【Java数据结构】---初始数据结构

时间:2024-08-05 23:23:26浏览次数:10  
标签:count Java 示例 int 复杂度 --- ++ array 数据结构

乐观学习,乐观生活,才能不断前进啊!!!

我的主页:optimistic_chen

我的专栏:c语言Java

欢迎大家访问~
创作不易,大佬们点赞鼓励下吧~

前言

从今天开始我们就要学习Java的数据据结构部分,根据前面Java语法的基础上,更加深入的了解算法的基本知识。

文章目录

什么是数据结构?

数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的
集合。

集合框架

Java 集合框架 Java Collection Framework ,又被称为容器 container ,是定义在 java.util 包下的一组接口 interfaces和其实现类 classes

Java当中已经实现好的一些集合类(数据结构)

我们总体的学习框架如下图所示:
在这里插入图片描述

容器具体的数据结构

  1. Collection:是一个接口,包含了大部分容器常用的一些方法
  2. List:是一个接口,规范了ArrayList 和 LinkedList中要实现的方法
    ArrayList:实现了List接口,底层为动态类型顺序表
    LinkedList:实现了List接口,底层为双向链表
  3. Stack:底层是,栈是一种特殊的顺序表
  4. Queue:底层是队列,队列是一种特殊的顺序表
  5. Deque:是一个接口
  6. Set:集合,是一个接口,里面放置的是K模型
    HashSet:底层为哈希桶,查询的时间复杂度为O(1)
    TreeSet:底层为红黑树,查询的时间复杂度为O( ),关于key有序的
  7. Map:映射,里面存储的是K-V模型的键值对
    HashMap:底层为哈希桶,查询时间复杂度为O(1)
    TreeMap:底层为
    红黑树
    ,查询的时间复杂度为O( ),关于key有序

如何学好数据结构?

首先要有代码量,只有写的代码足够多才慢慢熟悉数据结构的基本要领;其次,学习中要时刻记得画图,做题前先画图是一个“小白”的必经之路;之后学习的过程就是总结的过程,每学到一个章节要知道总结,最后才会变成自己的东西;最后要大量刷题,我推荐两个刷题的网站力扣(LeetCode)牛客建议由易到难,由简单到复杂,慢慢来,刚开始一定慢。

时间复杂度和空间复杂度

解决一个问题有多种算法,那么就一定有最高效的算法,这就是算法效率:第一种是时间效率,第二种是空间效率。 但是实际上,只要能解决问题的算法都是好算法。

时间效率(时间复杂度):时间复杂度主要衡量的是一个算法的运行速度
空间效率(空间复杂度):空间复杂度主要衡量一个算法所需要的额外空间

时间复杂度

时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个数学函数,它定量描述了该算法的运行时间.一个算
法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度。

大O的渐进表示法

大O符号:是用于描述函数渐进行为的数学符号。

void func1(int N){
  int count = 0;
  for (int i = 0; i < N ; i++) {
    for (int j = 0; j < N ; j++) {
      count++;
   }
 }
 for (int k = 0; k < 2 * N ; k++) {
    count++;
 }
  int M = 10;
  while ((M--) > 0) {
    count++;
 }
  System.out.println(count);
}

Func1 执行的基本操作次数 :F(N)=N²+2*N+10

推导大O阶方法

  1. 用常数1取代运行时间中的所有加法常数。
  2. 在修改后的运行次数函数中,只保留最高阶项。
  3. 如果最高阶项存在且不是1则去除与这个项目相乘的常数。得到的结果就是大O阶。

使用大O的渐进表示法以后,func1的时间复杂度为:O(N²)

在实际中一般情况关注的是算法的最坏运行情况,所以数组中搜索数据时间复杂度为O(N)

代码示例:
示例1:

void func2(int N) {
  int count = 0;
  for (int k = 0; k < 2 * N ; k++) {
    count++;
 }
  int M = 10;
  while ((M--) > 0) {
    count++;
 }
  System.out.println(count);
}

示例1基本操作执行了2N+10次,通过推导大O阶方法知道,时间复杂度为 O(N)

示例2:

void func3(int N, int M) {
  int count = 0;
  for (int k = 0; k < M; k++) {
    count++;
 }
  for (int k = 0; k < N ; k++) {
    count++;
 }
  System.out.println(count);
}

示例2基本操作执行了M+N次,有两个未知数M和N,时间复杂度为 O(N+M)

示例3:

void bubbleSort(int[] array) {
  for (int end = array.length; end > 0; end--) {
    boolean sorted = true;
    for (int i = 1; i < end; i++) {
      if (array[i - 1] > array[i]) {
        Swap(array, i - 1, i);
        sorted = false;
     }
   }
    if (sorted == true) {
      break;
   }
 }
}

示例3基本操作执行最好N次,最坏执行了(N(N-1))/2次,通过推导大O阶方法+时间复杂度一般看最坏,时间复杂度为 O(N²)*

空间复杂度

空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度。 空间复杂度算的是变量的个数,也使用大O渐进表示法。

代码示例:

示例1:

void bubbleSort(int[] array) {
  for (int end = array.length; end > 0; end--) {
    boolean sorted = true;
    for (int i = 1; i < end; i++) {
      if (array[i - 1] > array[i]) {
        Swap(array, i - 1, i);
        sorted = false;
     }
   }
    if (sorted == true) {
      break;
   }
  }
 }

示例1使用了常数个额外空间,所以空间复杂度为 O(1)

示例2:

int[] func4(int n) {
  long[] array = new long[n + 1];
  array[0] = 0;
  array[1] = 1;
  for (int i = 2; i <= n ; i++) {
  array[i] = array[i - 1] + array [i - 2];
 }
  return array;
}

示例2动态开辟了N个空间,空间复杂度为 O(N)

完结

好了,到这里Java语法部分就已经结束了~
如果这个系列博客对你有帮助的话,可以点一个免费的赞并收藏起来哟~
可以点点关注,避免找不到我~ ,我的主页:optimistic_chen
我们下期不见不散~~Java

下期预告: Java【数据结构】----泛型

标签:count,Java,示例,int,复杂度,---,++,array,数据结构
From: https://blog.csdn.net/optimistic_chen/article/details/140666475

相关文章

  • Spring源码(六)--BeanFactory 实现与继承关系
    BeanFactory实现与继承关系这些接口和类的源码,每一个都可以看一下。ListableBeanFactory由bean工厂实现的BeanFactory接口的扩展,这些bean工厂可以枚举它们所有的bean实例,而不是按客户端请求逐个按名称进行bean查找。HierarchicalBeanFactory由bean工厂实现的子接口,可以是......
  • limu|P1-7|安装、预备知识
    安装:建议参考小土堆Pytorch教程的第一课,然后需要1-下载所有JupiterNotebook的文件并解压;2-pipinstalld2l相当于一次性把课程需要用到的包都install,但是这么下亲测很慢,不如到时候用到的时候发现没装,再install预备知识:仅说几个我觉得有意思的概念(全文字,一点点代码,懒得写公式),具......
  • 洛谷题单指南-前缀和差分与离散化-P1904 天际线
    原题链接:https://www.luogu.com.cn/problem/P1904题意解读:给出(左端点,高度,右端点)表示的若干建筑,要输出其轮廓,所谓轮廓就是每个点被覆盖的最高建筑的高度所描绘的线。解题思路:如果能计算每个点被覆盖的最高建筑的高度,用数组h[10005]保存,那么输出轮廓的过程只需要枚举每一个点,如......
  • 01-初识Docker
    1.常规应用部署面临的问题部署流程复杂环境不一致资源隔离问题交付流程复杂1)JavaWEB架构:代码打包——>上传镜像仓库——>镜像下载至服务器——>服务器运行镜像2)JavaSpingboot一体式架构:代码打包——>上传镜像仓库——>镜像下载至服务器——>服务器运行镜像3)JavaCl......
  • ARC181 - B - Annoying String Problem
    B-令人讨厌的字符串问题编辑:evima在大多数情况下,\(f(S,T,X)\)和\(f(S,T,Y)\)的长度相等,这揭示了\(T\)的长度。让我们来看看当已知\(S\)和\(T\)的长度时,在什么条件下\(S\)和\(T\)满足\(f(S,T,X)=f(S,T,Y)\)。例题例如,当\(|S|=6\)和\(|T|=4\)时,让我们考虑当\(S+......
  • 题解 P6873 [COCI2013-2014#6] FONT
    link题意给你\(N\)个单词,问最多能组成多少个包含所有小写英文字母的句子。\(\mathrm{Solution}\)\(N\le25\)显然搜索。枚举当前选还是不选,搜到头判断是否成功即可。\(\mathrm{Code}\)#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;consti......
  • selenium复习之---原理+基础用法
    简介1.是什么selenium是用来进行页面元素定位的第三方库,用来进行web自动化测试的工具,可以直接运行在浏览器中。2.原理:selenium在工作过程中有三个角色,selenium客户端、webdriver和浏览器selenium客户端是开发者与selenium的交互接口,它会发送指令给webdriver浏览器则接收来自......
  • Studying-代码随想录训练营day59| dijkstra(堆优化版)精讲、Bellman_ford 算法精讲
    第59天,dijkstra算法的优化版本,以及Bellman_ford算法......
  • 【C基础-按要求找数】一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方
    一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少完全平方数是指一个整数能够表示为某个整数的平方。换句话说,如果存在一个整数 n,使得 n^2=m,那么 m 就是一个完全平方数。使用C语言实现,具体代码:#include<stdio.h>#include<math.h>int......
  • 解决Maven Deploy时提示module java.base does not "opens java.util" to unnamed mod
    使用Maven向中央仓库推送项目时,遇到Unabletomakefieldprivatefinaljava.util.Comparatorjava.util.TreeMap.comparatoraccessible:modulejava.basedoesnot"opensjava.util"tounnamedmodule的错误提示。网上搜了下,大概是因为自Java9起,引入了模块系统(ProjectJig......