## JAVA数据结构与算法
### [在线文档](https://www.wudskq.com/structure-project/structure-project.html)
### 项目结构说明:
- cn.com.wudskq.algorithm 为算法包
- cn.com.wudskq.datastructure 为数据结构包
- 算法包与数据结构包下各自有questionn包,其中写了相关数据结构/算法经典的问题
- cn.com.wudskq.utils 为工具类包
### 1.算法与数据结构的关系
- 数据结构: 是一门研究组织数据方式的学,通俗来讲就是研究数据以什么样的方式组织在一起,自动有了编程语言,也就有了数据结构,学好数据结构就可以编写出更高效,更漂亮的代码
- 想要学好数据结构就要多多联系生活中的例子进行联系
- 程序 = 数据结构 + 算法, 数据结构是算法的基础
- eg: 例如数组就是一种数据结构
### 2.数据结构包含哪些?
- 数据结构主要包括线性结构与非线性结构
- 线性结构特点:
- 线性结构作为最常用的数据结构,其特点是数据与数据之间存在一对一的线性关系
- 线性结构有两种不同的存储结构:
- 顺序存储结构: 顺序存储的线性表称为顺序表,顺序表中存储的元素是连续的
- 链式存储结构: 链式存储的线性表称为链式表,链式表中存储的元素不一定是连续的,元素节点中存储元素本身信息外还存储相邻元素的地址信息
- 线性结构常见的有: 数组,链表,队列,栈
- 非线性结构特点:
- 常见的非线性数据结构有:二维数组,多维数组,广义表,树结构,图结构
### 3.数据结构
#### 3.1 数组(二维数组)及应用场景
- 场景介绍: 有一盘五子棋,需要使用计算机程序实现五子棋白旗黑棋功能,并实现存盘,续盘功能,利用合适的数据结构进行实现并尽可能做到内存占用最小
- 思路解析: 可使用二维数组进行实现,白棋设定为0,黑棋设定为1,存盘续盘功能使用数据库进行实现
- 存盘读盘表结构设计
```sql
DROP TABLE IF EXISTS array_data;
CREATE TABLE array_data(
id bigint(32) NOT NULL AUTO_INCREMENT COMMENT '' ,
row_id int(60) COMMENT '行号' ,
column_id int(60) COMMENT '列号' ,
data int(60) COMMENT '数据' ,
PRIMARY KEY (id)
) COMMENT = '数组存盘表';
```
- 存盘: 遍历二维数组,拿到每行的所有数据,再次进行遍历row中的column的所有数据,存入data中
```java
//存盘
private static void saveChess(int[][] array) throws SQLException {
String sql = "insert into array_data (row_id,column_id,data) value (?,?,?);";
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length ; j++) {
int item = array[i][j];
//保存每行数据
Conn.saveChess(sql,i,j,item);
}
}
}
```
- 读盘: 遍历二维数组,根据row,column的index索引值作为查询条件查询出data,并赋值给该二维数组
```java
//读盘
private static void queryChess(int[][] array) throws SQLException {
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length ; j++) {
int row = i,column = j;
String sql = String.format("select data from array_data where row_id =%d and column_id =%d", row, column);
int data = Conn.queryChess(sql, "data");
array[i][j] = data;
}
}
}
```
#### 3.2 数组(稀疏数组)
- 场景依然是3.1五子棋盘场景,要求用最小的内存或存储空间实现五子棋盘的存盘/读盘功能
- 稀疏数组定义: 稀疏数组依然是一个二维数组,只不过是一个特殊的二维数组,该数组第一行存储普通二维数组的大小(即就是二维数组的行高,列宽,有效数的个数),从第二行开始存储改有效数据的位置
- 结构图解
<img src="https://aliyun-images-service.oss-cn-hangzhou.aliyuncs.com/wudskq/data/20220225003819.png" alt="image-20220225003813852" style="zoom:50%;" />
- 稀疏数组重点: 稀疏数组最重要的结构是为三列,除过第一行外,第一列存储行坐标,第二列存储列坐标,第三列存储数据
- 初始化: 遍历原始二维数据,找到有效值个数,及行高,列宽,
```java
/**
* 遍历原始数组,计算有效值并初始化稀疏数组;
* @param array 数组
*/
private static int[][] initArray(int[][] array){
//计数器
int count = 0;
int row = 0,column =0;
for (int i = 0; i < array.length; i++) {
row = array.length;
column = array[i].length;
for (int j = 0; j < array[i].length; j++) {
int item = array[i][j];
if(item != 0){
count++;
}
}
}
//初始化稀疏数组,有效值个数+1为行高
int[][] sparseArray = new int[count+1][3];
sparseArray[0][0] = row;
sparseArray[0][1] = column;
sparseArray[0][2] = count;
return sparseArray;
}
```
- 存盘:遍历原始二维数组,判断有效值,并从第二行开始存入稀疏数组
```java
//存盘操作
private static void saveChess(int[][] array,int[][] sparseArray){
//计数器
int count = 0;
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
int item = array[i][j];
//判断有效值
if(item != 0){
count ++;
//列的功能不变
sparseArray[count][0] = i;
sparseArray[count][1] = j;
sparseArray[count][2] = item;
}
}
}
}
```
- 读盘: 取出稀疏数组第一行数据,进行初始化二维数组,接着从第二行开始遍历稀疏数组,进行有效值的填充
```java
//读盘
private static int[][] queryChess(int[][] sparseArray){
//取出稀疏数组第一行数据,进行初始化二维数组
int row = sparseArray[0][0];
int column = sparseArray[0][1];
int [][] array = new int[row][column];
for (int i = 0; i < sparseArray.length-1; i++) {
for (int j = 0; j< sparseArray[i].length-1 ; j++) {
int rowId = sparseArray[i + 1][0];
int columnId = sparseArray[i + 1][1];
int data = sparseArray[i + 1][2];
array[rowId][columnId] = data;
}
}
return array;
}
```
#### 3.3 队列(数组实现)
- 业务场景描述: 银行排队叫号, 客户在大厅中打号,排队,第一个叫到号的人首先办理业务,一次二号,三号,等等
- 遵循先进先出规则,第二个编号的客户也不需要关注自己站在哪,坐在哪,只需要关注自己前一个编号是否能被叫到,
- 队列概念: 队列是一个有序列表,可以用数组或链表来实现,遵循先进选出原则
- 数组实现队列示意图
<img src="https://aliyun-images-service.oss-cn-hangzhou.aliyuncs.com/wudskq/data/20220226193356.png" alt="image-20220226193356111" style="zoom: 50%;" />
- 数组实现队列思路(尾插法)
- 队列需要遵循先进先出原则,使用数组实现队列,需要两个辅助指针(头部指针与尾部指针),还需要一个最大容量
- 插入数据时,从尾部插入,尾指针下标后移,新增数据时记得判断该队列是否已满
- 取出数据时,从头部取出,头指针下标后移,取出数据时记得判断该队列是否为空
- 队列判空, 如果头部指针等于尾部指针说明该队列为初始化的队列,无数据新增(尾部指针未后移),则该队列为空
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
算法与数据结构涵盖了以下主要内容: 数据结构(Data Structures): 逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树)、图结构(有向图、无向图等)以及集合和队列等抽象数据类型。 存储结构(物理结构):描述数据在计算机中如何具体存储。例如,数组的连续存储,链表的动态分配节点,树和图的邻接矩阵或邻接表表示等。 基本操作:针对每种数据结构,定义了一系列基本的操作,包括但不限于插入、删除、查找、更新、遍历等,并分析这些操作的时间复杂度和空间复杂度。 算法: 算法设计:研究如何将解决问题的步骤形式化为一系列指令,使得计算机可以执行以求解问题。 算法特性:包括输入、输出、有穷性、确定性和可行性。即一个有效的算法必须能在有限步骤内结束,并且对于给定的输入产生唯一的确定输出。 算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法,分支限界法等。 算法分析:通过数学方法分析算法的时间复杂度(运行时间随数据规模增长的速度)和空间复杂度(所需内存大小)来评估其效率。 学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。
资源推荐
资源详情
资源评论
收起资源包目录
structure-project(java数据结构与算法).zip (169个子文件)
.gitignore 743B
IIOPInputStream.java 114KB
TypeCodeImpl.java 85KB
CDRInputStream_1_0.java 80KB
ObjectStreamClass.java 67KB
CDROutputStream_1_0.java 61KB
AnyImpl.java 46KB
PIHandlerImpl.java 36KB
DynAnyConstructedImpl.java 34KB
ValueHandlerImpl.java 34KB
ClientRequestInfoImpl.java 34KB
IDLJavaSerializationInputStream.java 34KB
RequestInfoImpl.java 33KB
ServerTool.java 32KB
ServerRequestInfoImpl.java 30KB
Util.java 28KB
InterceptorInvoker.java 28KB
CodeSetConversion.java 26KB
IIOPOutputStream.java 25KB
IDLJavaSerializationOutputStream.java 24KB
ServerManagerImpl.java 22KB
DynAnyBasicImpl.java 20KB
ValueUtility.java 18KB
InputStreamHook.java 17KB
ServerTableEntry.java 16KB
CDRInputStream.java 16KB
RepositoryImpl.java 15KB
DynAnyComplexImpl.java 14KB
DynUnionImpl.java 14KB
CDROutputStream.java 13KB
DynAnyUtil.java 13KB
CDROutputStream_1_2.java 12KB
BufferManagerReadStream.java 12KB
ORBInitInfoImpl.java 12KB
PortableRemoteObject.java 12KB
ORBD.java 12KB
ServerMain.java 11KB
CDROutputObject.java 11KB
RequestImpl.java 10KB
CodeSetComponentInfo.java 10KB
OutputStreamHook.java 10KB
IORInfoImpl.java 10KB
IIOPProfileImpl.java 10KB
IORImpl.java 10KB
TypeCodeOutputStream.java 9KB
DynSequenceImpl.java 9KB
TCUtility.java 9KB
InterceptorList.java 9KB
ServerRequestImpl.java 8KB
CDRInputObject.java 8KB
ObjectKeyFactoryImpl.java 8KB
CDRInputStreamBase.java 8KB
ByteBufferWithInfo.java 8KB
WrapperInputStream.java 8KB
StubIORImpl.java 7KB
BufferManagerWriteCollect.java 7KB
CDREncapsCodec.java 7KB
TypeCodeInputStream.java 7KB
DynFixedImpl.java 7KB
ObjectStreamField.java 7KB
OSFCodeSetRegistry.java 7KB
CDROutputStreamBase.java 7KB
ByteBuffer.java 6KB
DynAnyCollectionImpl.java 6KB
EncapsInputStream.java 6KB
StubDelegateImpl.java 6KB
CachedCodeBase.java 6KB
DynAnyImpl.java 6KB
SlotTableStack.java 6KB
LegacyServerSocketManagerImpl.java 5KB
FVDCodeBaseImpl.java 5KB
CDRInputStream_1_1.java 5KB
DynEnumImpl.java 5KB
BufferManagerFactory.java 5KB
EncapsOutputStream.java 5KB
IIOPProfileTemplateImpl.java 5KB
PICurrent.java 5KB
CDRInputStream_1_2.java 5KB
ObjectKeyTemplateBase.java 5KB
CDROutputStream_1_1.java 4KB
ObjectReferenceTemplateImpl.java 4KB
PINoOpHandlerImpl.java 4KB
BufferManagerWrite.java 4KB
EncapsulationUtility.java 4KB
DynValueCommonImpl.java 4KB
DynArrayImpl.java 4KB
ObjectReferenceFactoryImpl.java 4KB
DefaultSocketFactory.java 4KB
SocketFactoryConnectionImpl.java 3KB
WireObjectKeyTemplate.java 3KB
OldJIDLObjectKeyTemplate.java 3KB
IORTemplateImpl.java 3KB
BufferManagerWriteStream.java 3KB
IORTemplateListImpl.java 3KB
CodecFactoryImpl.java 3KB
DynValueBoxImpl.java 3KB
MarshalInputStream.java 3KB
ObjectStreamClassCorbaExt.java 3KB
FreezableList.java 3KB
ProcessMonitorThread.java 3KB
共 169 条
- 1
- 2
资源评论
极致人生-010
- 粉丝: 2973
- 资源: 2825
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功