forked from yuhldr/LZUThesis2020
-
Notifications
You must be signed in to change notification settings - Fork 0
/
《数据结构》课程的学习报告.tex
2419 lines (1913 loc) · 81.7 KB
/
《数据结构》课程的学习报告.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
% !TEX TS-program = xelatex
% !TEX encoding = UTF-8 Unicode
\documentclass[AutoFakeBold]{LZUThesis2007}
\begin{document}
%=====%
%
%封皮页填写内容
%
%=====%
% 标题样式 使用 \title{{}}; 使用时必须保证至少两个外侧括号
% 如: 短标题 \title{{第一行}},
% 长标题 \title{{第一行}{第二行}}
% 超长标题\tiitle{{第一行}{...}{第N行}}
\title{{《数据结构》课程的学习报告}}
% 标题样式 使用 \entitle{{}}; 使用时必须保证至少两个外侧括号
% 如: 短标题 \entitle{{First row}},
% 长标题 \entitle{{First row}{ Second row}}
% 超长标题\entitle{{First row}{...}{ Next N row}}
% 注意: 英文标题多行时 需要在开头加个空格 防止摘要标题处英语单词粘连。
\entitle{{Study Report of Data Structres}}
\author{谭源}
\major{计算机类}
\advisor{蒙应杰}
\college{信息科学与工程学院}
\grade{2019级}
\maketitle
%======%
%诚信说明页
%授权说明书
%======%
\makestatement
\frontmatter
%中文摘要
\ZhAbstract{在计算机科学中,数据结构是计算机中存储、组织数据的方式。这学期使用《数据结构》\cite{严蔚敏1992数据结构第二版},蒙老师先由数据结构的定义开始讲起,再依次讲解了算法、线性表、栈和队列、串、数组和广义表、树形结构、图结构、排序、数据检索这几部分内容。
本文使用LaTeX编写,并使用git管理项目文件。项目已被开源到GitHub,老师可以通过查看commit记录来了解我学习的过程。项目地址为\url{https://github.com/Reset12138/LZU-Data-Structures},点击此超链接即可打开。
因时间缘故该版本还存在许多疏漏,如有不妥之处同学们可以Pull a Request。}{数据结构,综述,LaTeX}
%英文摘要
\EnAbstract{This essay explores the world of Date Structres. In computer science, a data structure is a data organization, management, and storage format that enables efficient access and modification. More precisely, a data structure is a collection of data values, the relationships among them, and the functions or operations that can be applied to the data.}
{data structure; review; LaTeX.
}
%生成目录
\tableofcontents
%文章主体
\mainmatter
\chapter{数据结构绪论}
\section{数据结构的基本概念及研究内容}
数据元素:具有完整确定意义的描述现实的某一个客观实体的一个最小数据集。数据元素类似原子,可以再分,每一项被称作数据项。
数据对象:具有相同属性的数据元素的集合。
数据结构:给定数据对象及其上面定义的操作所共同构成的一个系统 一个信息处理模型。
主要研究的三个方面:
\begin{enumerate}
\item 数据的逻辑结构
\begin{itemize}
\item 逻辑关系
在自然形态下,数据元素之间的一种关系
\item 逻辑结构
数据之间所有关系的一个集合
数学表示:B=(K,R),其中:
K:数据上的有穷集合
R:K上关系的有穷集合,其中每个关系r都是从K到K的关系
\item 分类
\begin{itemize}
\item 线性
一对一,单对单
\item 非线性
\begin{itemize}
\item 树形结构
唯一一个直接前驱,多个直接后继
\item 图结构
\end{itemize}
\end{itemize}
\end{itemize}
\item 数据的存储结构
\begin{itemize}
\item 存储关系
存储关系的数学内涵:须要建立数据对象(K)到存储区域(M)的映射关系(S):
S:K$\rightarrow$M
即$\forall \mathrm{k} \in \mathrm{K}$,都有唯一的$\forall \mathrm{Z} \in \mathrm{M}$,使得S(K)=Z,Z为K结点所占存储空间的始单元。
\item 存储结构
\begin{itemize}
\item 顺序结构
按照连续地址空间的顺序依次的存放数据
\item 链接结构
存储密度相比顺序结构下降
\item 索引结构
\item 散列结构
根据节点的值,通过一定的函数关系来确定数据元素的存储地址
\end{itemize}
\end{itemize}
\item 数据的运算关系
定义在逻辑结构上,在存储结构上实施,即:
\begin{itemize}
\item 抽象层面
\begin{itemize}
\item 逻辑关系
\item 需求
\end{itemize}
\item 实现层面
\begin{itemize}
\item 存储关系
\item 运算关系
\end{itemize}
\item 评价层面
\end{itemize}
\end{enumerate}
三个层次五个要素
\section{数据结构的选择与评价}
评价标准:
\begin{itemize}
\item 时间需要量与时间效率
\item 存储需要量与存储效率
\end{itemize}
\chapter{算法}
\section{算法的定义}
\subsection{概述}
算法是一个问题的具体解决方案。
\subsection{定义}
算法解决某一个问题的指令的有限集合。
基本特征:
\begin{itemize}
\item 有穷性
\item 确定性
\item 可行性
\item 输入
\item 输出
\end{itemize}
\subsection{内涵及分类}
内涵体现在过程上。
\begin{itemize}
\item 一般过程
\item 函数过程
强调结果
\end{itemize}
\subsection{算法与程序的异同}
\begin{itemize}
\item 程序不是算法
\item 程序不是算法 程序不一定满足有穷性
\end{itemize}
\section{算法的描述及设计原则}
\subsection{算法描述方法}
\begin{itemize}
\item 计算机程序设计语言
优点与缺陷:设计出=实现出
\item 自然语言
缺陷:雍长和二义性
\item PDL
\item 流程图
\end{itemize}
\subsection{算法基本标准}
\begin{itemize}
\item 正确性
\item 易读性
\item 健壮性
\item 高效性
\end{itemize}
\section{算法分析概论及有效算法}
\subsection{概念}
一般不需要知道精确的时间消耗,需要知道时间消耗的增长率大体在什么范围。
算法复杂性的阶:算法比较主要比较阶。
时间复杂性(时间渐进复杂性):利用某算法处理一个问题规模为n的输入所需要的时间,记为T(n)。
空间复杂性:利用某算法处理一个 问题规模为n的输入 所需要的存储空间,记为S(n)。
阶:对一个正常数C,一个算法在时间Ο($n^{2}$)内能处理规模为n的输入,则称此算法的时间复杂度是Ο(($n^{2}$),读作“($n^{2}$阶”,即该算法的时间复杂度与($n^{2}$是同阶的。
\begin{figure}[H]
\centering
\includegraphics[width=0.7\textwidth]{figures/2.1.jpg}
\label{fig_install_texlive}
\end{figure}
若一个算法时间复杂度为O(($2^{n}$),称其需要指数时间;若是O(($n^{k}$),称其为多项式时间。当n非常大时两个时间差异非常大。
以多项式时间为界限的算法称为有效算法。如果一个问题不存在以多项式时间为界限的算法,称为难解的(难解性问题)。
\begin{figure}[H]
\centering
\includegraphics[width=0.7\textwidth]{figures/2.2.jpg}
\label{fig_install_texlive}
\end{figure}
当n非常大时两个时间差异非常大。
\begin{figure}[H]
\centering
\includegraphics[width=0.7\textwidth]{figures/2.3.jpg}
\label{fig_install_texlive}
\end{figure}
对于时间复杂度,会关注时间复杂度的ϱ最坏情况和时间复杂度的平均情况。
\subsection{复杂性分析}
不需要知道精确的数值,只需要知道他一个规模。
\begin{itemize}
\item 时间复杂性的分析
\begin{enumerate}
\item 根据问题的特点合理选择一种或几种操作作为整个算法的“标准操作”(假设循环执行次数最多,循环就是标准操作)
\item 确定每个算法在给定输入下总共执行了多少次标准操作,并根据次数推导求出时间函数
\item 确定该函数的阶
\end{enumerate}
\item 空间复杂性的分析
\begin{enumerate}
\item 根据问题的特点合理选择一种或几种操作作为整个算法的“标准操作”(假设循环执行次数最多,循环就是标准操作)
\item 确定每个算法在给定输入下总共执行了多少次标准操作,并根据次数推导求出时间函数
\item 确定该函数的阶
\end{enumerate}
要求各个算法的存储结构一样的前提下,关注算法所需的附加存储空间复杂性
\end{itemize}
\section{算法设计方法概论}
\subsection{概述}
\begin{itemize}
\item 用科学的方法进行算法设计
\item 最常用方法:自顶向下 逐步求精
顶层:问题的总和、抽象全貌
底层:问题的具体化、展开、细节
求精的方法:
\begin{enumerate}
\item 分而治之
将问题划分为一些不相交的部分,依次解决
\item 作出有限进展
采用一个朝解的方向得到有限进展的方法,反复应用,逐渐逼近
\item 情况分析
对问题各种情况给予分析,选择适当方案。
\end{enumerate}
\item 健壮性
\item 高效性
\end{itemize}
\subsection{算法设计的基本技术}
以下内容不做要求
\begin{itemize}
\item 穷举法
\item 分治法
\item 回溯法
\item 分支界限法
\item 动态规划法
\item 贪心法
\end{itemize}
\section{算法描述语言}
\subsection{PDL概述}
Program、Design、Language
即伪码语言,主要用来书写软件设计的规约,是基于我们自然语言与具体的成设计语言之间的一种语言。这是一种保留计算机、程序设计、语言的基本框架和描述形式,并去掉一些特异性和直接性的要求,再结合自然语言所形成的一种用于描述算法处理的逻辑语言。
\subsection{PDL的优势}
\begin{itemize}
\item 表达能力强,具有关键字的固定语法。提供了特定的结构化控制结构
\item 引入了自然语言的一些习惯,结构比较清晰,简单易读
\item 容易转化为任何一种程序设计语言代码(可由PDL生成程序代码)
\end{itemize}
\subsection{PDL书写及要求}
\begin{enumerate}
\item 算法的框架
\begin{itemize}
\item 一般过程的书写框架
\begin{lstlisting}
PROC 过程名(I/O参数);
BEGIN
语句组
END;
\end{lstlisting}
\item 函数过程的书写框架
\begin{lstlisting}
FUNC 函数名(I/O参数):类型名;
BEGIN
语句组
END;
\end{lstlisting}
\end{itemize}
\item 词的定义及说明
标识符:按照一定的规则形成的具有特定含义的一个词。
\begin{itemize}
\item 过程名:调用前需定义
\item 常量名、变量名:使用前需说明
例如VAR i,j,k:integer
常见的数据类型名写法及表示:
\begin{itemize}
\item 整数型:integer
\item 实数型:real
\item 布尔型:boolean
\item 字符型(单字符):char
\item 子介型(用于表达范围):下界..上界,例如40..90(表示40-90),'A'..'G'
\item 枚举类型:{0,1,2,3} 元素次序不能变
\item 构造类型
\begin{itemize}
\item 数组型:
\begin{lstlisting}
ARRAY[下标类型] OF 成分类型
\end{lstlisting}
例如:
\begin{lstlisting}
A: ARRAY[1..20] OF integer
\end{lstlisting}
\begin{lstlisting}
B: ARRAY[1..20,-10..20] OF real
//(B是点集,二维数组)
\end{lstlisting}
\item 记录型:
\begin{lstlisting}
RECORD
域标识符1:类型1
…
域标识符n:类型n
END
\end{lstlisting}
例如:
\begin{lstlisting}
A=RECORD
Name:ARRAY[1…8] OF char;
Sex:0..1
Age:interger;
END
\end{lstlisting}
\end{itemize}
\item 指针类型:
\begin{lstlisting}
↑ 类型名
\end{lstlisting}
例如:
\begin{lstlisting}
TYPE A=↑integer; //指针类型
\end{lstlisting}
\begin{lstlisting}
VAR B:↑integer; //指针变量
\end{lstlisting}
\end{itemize}
\end{itemize}
\item 基本语序
\begin{itemize}
\item 赋值语句:
\begin{lstlisting}
变量名←表达式
\end{lstlisting}
\item 流程图
\item 条件语句
\begin{itemize}
\item 形式一
\begin{lstlisting}
if 条件 then 语句组
\end{lstlisting}
\item 形式二
\begin{lstlisting}
if 条件 then 语句组1
else 语句组2
\end{lstlisting}
\end{itemize}
\item 循环语句
\begin{itemize}
\item 当型(while)
\begin{lstlisting}
WHILE 条件 DO
语句组;
\end{lstlisting}
\item 直到型(repeat)
\begin{lstlisting}
REPEAT
语句组;
UNTIL 条件
\end{lstlisting}
\item 从到型(for-to)
\begin{itemize}
\item 默认步长为1:
\begin{lstlisting}
FOR 变量←初值 TO 终值 DO
语句组;
\end{lstlisting}
\item 自定义步长:
\begin{lstlisting}
FOR 变量←初值 TO 终值 STEP 步长值 DO
语句组;
\end{lstlisting}
\item 倒数:
\begin{lstlisting}
FOR 变量←初值 DOWNTO 终值 DO
语句组;
\end{lstlisting}
\end{itemize}
\end{itemize}
\item 输入语句:
\begin{lstlisting}
read(变量名表);
\end{lstlisting}
例:
\begin{lstlisting}
read(x,y,z);
\end{lstlisting}
\item 输出语句
\begin{lstlisting}
write(变量名表);
\end{lstlisting}
\end{itemize}
\item 拓展语序
\begin{itemize}
\item 情况语句
\begin{lstlisting}
CASE
条件1:语句组1;
条件2:语句组2;
……
条件n:语句组n;
[ELSE 语句组n+1]
ENDCASE
\end{lstlisting}
\item 一般过程调用语句:
\begin{lstlisting}
Call 过程名;
\end{lstlisting}
\item 函数过程调用:通过在表达式中引用函数名完成,即被引用函数名出现在表达式中
\item 出错提示语句:
\begin{lstlisting}
error(错误信息);
\end{lstlisting}
\item 终结语句
\begin{lstlisting}
Exit \\算法转向正常结束
\end{lstlisting}
\begin{lstlisting}
Return \\算法转向正常结束,携带值离开
\end{lstlisting}
\begin{lstlisting}
Abort \\中途废止(中止)
\end{lstlisting}
\item 复合语句
\begin{lstlisting}
[ 简单语句1;
简单语句2;
……
简单语句n; ]
\end{lstlisting}
或用Begin End 代替括号
\item 动态符号
\begin{itemize}
\item 储存单元的引用:
\begin{lstlisting}
指针变量名↑
\end{lstlisting}
例:
\begin{lstlisting}
x↑
\end{lstlisting}
\item 动态空间分配:
\begin{lstlisting}
New(P)
\end{lstlisting}
\item 动态空间回收:
\begin{lstlisting}
Dispose(P)
\end{lstlisting}
\item 空地址的表示:
\begin{lstlisting}
Nil
\end{lstlisting}
\end{itemize}
\end{itemize}
\end{enumerate}
\chapter{线性表}
\section{线性表及其运算}
\subsection{线性表的定义}
线性表的定义:一个线性表是n$\ge$0个数据元素$a_{1}, a_{2}, \dots \dots, a_{n}$的有限序列,序列中除第一及最后一个元素以外,每个元素有且只有一个直接前驱和直接后继。
简称表,可表示为:$A=\left(a_{1}, a_{2}, \dots \dots, a_{n}\right)$
\begin{lstlisting}
ai:datatype //表示ai 项可以是任何类型
\end{lstlisting}
\subsection{线性表的特征}
\begin{itemize}
\item 有限的。线性表的表长:线性表元素的个数。控标的长度定义为0
\item 元素呈线性关系。元素的位置只取决于他们自己的逻辑顺序。
\end{itemize}
\subsection{线性表的运算}
\begin{itemize}
\item 确定线性表的长度n
\item 存取线性表的第i个数据元素,检验或改变某个数据项的值
\item 在第i-1个和第i个数据元素之间插入一个新的数据元素。约定插入的元素是第i个元素的直接前驱
\item 删除第i个元素
\item 将两个或两个以上的线性表合并成一个线性表
\item 将一个线性表拆分成两个或两个以上的线性表
\item 重新复制一个线性表
\item 对线性表中的数据元素依据某一种规则进行重组
\end{itemize}
\section{线性表的储存表示}
\begin{itemize}
\item 线性表的向量表示
\begin{itemize}
\item 存储方法
顺序地分配存储单元,且每个数据元素占据相同大小的存储空间(顺序且等长)
\item 数据访问
TODO
\item 向量存储结构特性
\begin{itemize}
\item 储存分配呈线性结构
\item 属于随机存储结构(访问一个元素的代价与元素位置无关,即访问任何一个元素(找地址)的运算量一样,一维数组,通过下标变量来访问(数组构造的本质即算公式))
\end{itemize}
\item 向量存储结构的形式化表示
可用一个一维数组表示,由于数组属于静态结构,其空间规模须事先定义(1..max),要有个计数器记录数组长度(空间规模)
表述形式:
\begin{lstlisting}
TYPE SQLIST:ARRAY[1..max] OF datatype;
## 内容
VAR n:0..max;
## 计数器(记录数组长度)
\end{lstlisting}
\begin{lstlisting}
TYPE SQLIST= RECORD
data:ARRAY[1..max] OF datatype;
## 内容 n:0..max; ## 计数器(记录数组长度)
END;
\end{lstlisting}
\item 插入
\item 删除
\item 小结
\end{itemize}
\item 线性表的链表表示
\begin{itemize}
\item 单链表表示
\begin{lstlisting}
TYPE pointer=↑node;
node= RECORD
data: datatype;
next: pointer;
END;
link=pointer;
\end{lstlisting}
\item 带表头的单链表表示
\item 带表头结点的循环单链表表示
\item 带表头结点的双向循环链表表示
\begin{lstlisting}
TYPE pointer=↑node;
node= RECORD
Left: pointer;
data: datatype;
right: pointer;
END;
dblink=pointer;
\end{lstlisting}
\end{itemize}
\begin{figure}[H]
\centering
\includegraphics[width=0.7\textwidth]{3.1.jpg}
\label{fig_install_texlive}
\end{figure}
\begin{figure}[H]
\centering
\includegraphics[width=0.7\textwidth]{3.2.jpg}
\label{fig_install_texlive}
\end{figure}
\item 线性表的应用
\end{itemize}
\chapter{栈和队列}
\section{栈及其运算}
栈是工具性数据结构。
\subsection{绪论}
\subsection{栈的基本定义}
栈是一个下限为常数,上限可变化的向量(或者反之)。有时称为堆栈或堆阵。
后进先出表(LIFO)。
可变化一端称为栈顶,不变化的一端称为栈底。
\subsection{与线性表的关系}
\begin{itemize}
\item 相同点
\begin{itemize}
\item 逻辑关系都是线性关系
\end{itemize}
\item 不同点
\begin{itemize}
\item 线性表可以从任意位置增删,栈的增删只能从表尾进行
\item 栈的运算是线性表的一个子集,且这个子集还需加以约束
\end{itemize}
\end{itemize}
\subsection{栈的运算}
\begin{itemize}
\item 入栈,PUSH(S),完成往栈中加入元素的过程,即插入操作,也称为压栈
\item 出栈,POP(S),完成从栈中取出元素的过程,即删除操作,也称为弹出
\end{itemize}
\subsection{栈的存储与运算的实现}
\subsection{多栈共存问题}
\section{栈的应用}
\section{队列及其运算}
\begin{itemize}
\item 绪论
分时和并行,主要处理对稀缺资源的争夺
\item 队列的定义
队列是一个下限和上限只能增加而不能减少(下限和上限的指针只能往一个方向移动)的向量(或者反之)
先进先出表(FIFO)
\item 队列与线性表
\begin{itemize}
\item 相同点
\begin{itemize}
\item 逻辑关系都是线性关系
\end{itemize}
\item 不同点
\begin{itemize}
\item 线性表可以从任意位置增删,队列的只能一端插入一端删除
\item 队列的运算是线性表的一个子集,且这个子集还需加以约束
\end{itemize}
\end{itemize}
\item 队列的运算
\begin{itemize}
\item 出队
\item 入队
\end{itemize}
\item 队列的存储与运算的实现
\end{itemize}
\section{受限的栈及队列(了解)}
\begin{itemize}
\item 双端队列
双端队列是一种所有的插入和删除都限制在表的两端进行的线性表
\item 双栈
双栈是一种加限制的双端队列,即从哪端进就只能从哪端出,就像是两个底部相连的栈
\item 超队列
超队列是一种删除受限制的双端队列,删除限制在一端,插入可以在两端
\item 超栈
超栈是一种插入受限制的双端队列,插入限制在一端,删除可以在两端
\end{itemize}
\chapter{串}
\section{串及其运算}
\begin{itemize}
\item 概述
字符串是线性表模型数据元素实例化的体现
全称字符串
早期:作为输入输出的常量和提示
热点:中文信息处理
\item 串的定义
一个由零个或多个字符组成的有穷序列称为串
简记为$A=^{\prime}a_{1} a_{2} a_{3} \dots a_{n}^{\prime}$
串的长度:串中所含的字符个数
空串:串长为零的串,记作Φ
非空串
空白串:空白字符组成的串,记作$^{\prime}\sqcup^{\prime}$
串的相等:串长也相等,对应位置上的字符也一样
字串/主串:一个串中任意个连续字符组成的子序列称为该串的子串,该串成为它的所有子串的主串。不一定是一个真子集
\item 串的运算
\begin{itemize}
\item 赋值
assign(S,chars) 将字符串常量chars赋给字符串变量S
\item 连接
concatenation(S,T) 将字符串S和T联接在一起
\item 取子串
substring(S,m,n) 从第m个位置开始取n个连续字符(通常)/从第m个位置开始到第n个位置
\item 求子串序号
strindex(S,T,i) 确定串T在S中第一次出现的位置i
\item 串的插入
strinsert(S,T,i)
\item 串的删除
strdelete(S,m,n)
\item 串的复制
copy(S,T)
\item 串的置换
replace(A,B,C)(找到A中的B用C来替换)
replace(S,m,n,T)(把S字符串的(m到n/从m开始的n个字符)用T来替换)
\end{itemize}
\item 串的存储
\begin{itemize}
\item 顺序储存
一般用向量来表示,通常称为字符串数组、字符串变量、字符串常量
\begin{itemize}
\item 压缩模式
按字节存储数据 (C语言)
\item 非压缩格式
运算器以字为单位运算,存储器以字节为单位,为了避免转换浪费的时间,存储器以字为单位存储一个字符,变成非压缩模式(只存一个字母需要一个字的空间,比较浪费)
\end{itemize}
\item 索引储存
多用在对于多个字符串常量或者变量的组织
\item 链接储存
理论上研究的多,实际上用的少,不易于实现
\end{itemize}
\end{itemize}
\section{串的模式匹配}
\begin{itemize}
\item 概述
在模式分类或者问题回答系统等方面,将输入模式与样本模式进行匹配的过程啊,我们就把它称为模式匹配。
通常把S称为目标(或正文),把P称为模式,把从目标S中查找模式P的过程称为模式匹配。
串的匹配是模式匹配的实例化。
\item 匹配的朴素算法(Brute-Force算法)
\begin{figure}[H]
\centering
\includegraphics[width=0.7\textwidth]{figures/5.1.jpg}
\label{fig_install_texlive}
\end{figure}
处理基本思想:对正文顺序搜索
\begin{enumerate}
\item 逐次比较(对应字符依次比较)
\item 发现不匹配时,将P相对于S右移一位
\item 重复上述过程,直到成功或扫描完S
\end{enumerate}
\begin{figure}[H]
\centering
\includegraphics[width=0.7\textwidth]{figures/5.2.jpg}
\label{fig_install_texlive}
\end{figure}
优化算法:KMP算法
\end{itemize}
\section{例题}
2019年兰州大学开源社区纳新面试题中有一题关于字符串的运算,现将我的解决方案附于后文。
给出一个文本文件,其中每个单词不包括空格及跨行,单词由字符序列构成且不区分大小写,完成以下功能:统计给定单词在文本文件中出现的总次数。
注:允许使用 string.h
\begin{lstlisting}[language=c]
#include<stdio.h>
#include<string.h>
char word[100];
char text[10000];
int count = 0;
char trans(char c){
if(c >= 'A'&&c <= 'Z'){
c = c + 'a' - 'A';
}
return c;
}
void getword() {
char c;
int i = 1;
while (1) {
c = getchar();
if (c == '\n') break;
word[i] = trans(c);
i++;
}
word[0] = i - 1;//第0位存放单词长度
return;
}
void gettext() {
char c;
int i = 1;
while (1) {
c = getchar();
if (c == EOF) break;
text[i] = trans(c);
i++;
}
text[0] = i - 1;//第0位存放文本长度
return;
}
void check() {
int i = 0, j = 0;
int flag = 1;
while (1) {
i++;
j++;
if (i == text[0]) break;
if (text[i] == '\n' || text[i] == ' ') {
j = 0;
flag = 1;
continue;
}
if (flag == 0) {
continue;
}
if (text[i] != word[j])
flag = 0;
if (j == word[0]) {
if (flag == 1) {
if (text[i + 1] == '\n' || text[i + 1] == ' ')
count++;
}
flag = 1;
}
}
}
int main()
{
freopen("C:\\Users\\Kente\\Desktop\\123\\text.txt", "r", stdin);//假设给出的文本文件第一排是给定单词,第二排及之后是要统计的文本
getword();
gettext();
check();
printf("%d", count);
return 0;
}
/*text.txt
ABC
Abc abC dasasdsa abc
dasdasdasdasd dasdasdasdasd
abc ab
*/
\end{lstlisting}
\chapter{数组和广义表}
\section{数组的定义与运算}
\subsection{定义}
一维数组是一个向量,它的每个元素是该结构中不可分割的最小单位;n(n>1)维数组是个向量,它的每个元素是n-1维数组,且具有相同的下限和上限。
向量(只有量值而无方向的量)是标量的一维的有序集合。
\subsection{运算}
\begin{itemize}
\item 给定一组下标,存取相应数据元素
\item 给定一组下标,修改相应的数据元素的某个属性的值
\end{itemize}
\section{数组元素的地址访问}
\subsection{概述}
数组是一种静态存储结构,数组定义需给出数组规模。数组元素访问依靠下标变量。
词典编辑序:
\begin{itemize}
\item 行主序(行优先,行为主)(更常见)
从上到下,每行从左到右
\item 列主序
从左到右,每列从上到下
\end{itemize}
\begin{figure}[H]
\centering
\includegraphics[width=0.7\textwidth]{6.1.jpg}
\label{fig_install_texlive}
\end{figure}
\subsection{地址计算}
(默认讨论行主序)
\subsubsection{二维数组}
设置数组$A\left(c_{1}, . d_{1}, c_{2} \dots d_{2}\right)$,首地址为$\operatorname{Loc}\left(c_{1}, c_{2}\right)=A O(A)$(基地址),元素长度为l
\begin{figure}[H]
\centering
\includegraphics[width=0.7\textwidth]{6.2.png}
\label{fig_install_texlive}
\end{figure}
$\operatorname{Loc}(i, j)=\left[\left(i-c_{1}\right)\left(d_{2}-c_{2}+1\right)+\left(j-c_{2}\right)\right]^{*} l+A O(A)$
二维数组是随机存储结构。