Skip to content

TianGL/Data_Sturcture_Exercise

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

46 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

数据结构练习

未完待续

个人学习数据结构的一些代码(C++)教材和课程是根据清华大学邓俊辉老师的数据结构教程(课程链接),代码在CLion中编写(只是为了方便输入)。代码大部分是参考邓老师提供的源码和书上的代码,加强记忆自己敲了一边,也添加了一些自己对课后习题的解答。

代码中的很多算法和数据结构的构造十分经典,我也根据自己的学习从新归纳整理了下

//copyright and some information of Junhui DENG
/*********************************************************************
 * Data Structures in C++
 * ISBN: 7-302-33064-6 & 7-302-33065-3 & 7-302-29652-2 & 7-302-26883-3
 * Junhui DENG, deng@tsinghua.edu.cn
 * Computer Science & Technology, Tsinghua University
 * Copyright (c) 2006-2013. All rights reserved.
***********************************************************************/

第一章 绪论

  • 1_Fibonacci

    • Fibonacci sequence 类:

      `get()`: 获取当前Fib项;
      
      `next()`: 转至下一个Fib项;
      

      prev(): 转至前一个Fib项目

    • 三种计算fibonacci 的方法

      迭代法`long long fibI( int n)`( $O(n)$ );
      
      二分递归`long long fib(int n)`( $O(2^n)$ );
      

      ​ 线性递归long long fib(int n, long long &prev)( $O(n)$ )

  • Chapter_1_unrun_code: 习题程序

    • Fun1_7: 包含循环、分支、子函数调用,甚至递归算法的样例程序

    • Fun1_12: 统计整数二进制展开中数位1的总数 (两种方法) (邓老师提供里测试代码countones)

    • Fun1_13: 幂函数$2^n$算法 (蛮力递归版本 $O(2^r)$ ) //r为输入比特长度

    • Fun1_14: 幂函数$2^n$算法(优化迭代版本) $O(r)$ //r为输入比特长度

    • Fun1_15: 计算数组区间A[lo, hi)的最大值 ( 二分递归 )

    • 1_23_Hanoi: Hanoi问题

    • 1_25_gcdCN: 最大公约数为题

      九章算术 “中华更相减损数”gcdCN: $O( log(a+b) )$ 
      
      欧式算法gcd: $O( log(a*b) )$
      
    • 1_26_shift2: 将数组左循环k位

    • 1_27_Ackermann: 计算Ackermann函数值

    • 1_29_Hailstone: Hailstone 序列

第二章 向量

  • Vector数据结构极其相关方法

    • main.cpp: 测试程序 (iussues unsolved)

    • Vector.h: vector模板类

    • Vector_implementatiom.h: 引入vector各方法的实现头文件

    • vector_bracket.h:

      • T &operator[](Rank r) const// 重载下标操作符[],可以通过vecotr[]访问向量中的元素
    • vector_assignment.h: Vector<T> & operator = ( Vector<T> const& )//重载下标操作符=,可以通过vecotr[]访问向量中的元素

    • vector_constructor_by_copying.h

      • void copyFrom(T const *A, Rank lo, Rank hi)//复制数组区间A[lo,hi]
    • vector_expand.h

      • `void expand() //空间不足时扩容(翻倍)
    • vector_shrink.h

      • void shrink() // 填装因子过小时压缩(减半)
    • Vector_insert.h

      • Rank insert ( Rank r, T const& e ) // 插入元素
    • vector_remove.h

      • T remove ( Rank r) // 删除秩为r的元素
    • vector_removeInterval.h

      • Rank insert ( Rank r, T const& e ) //插入元素
    • vector_removeInterval.h

      • int remove ( Rank lo, Rank hi) // 删除秩在区间[lo, hi)内的元素
    • Vector_disordered.h

      • int disordered() const // 判断向量是否以排序,返回向量中逆序相邻元素对的总数
    • Vector_find.h

      • Rank find(T const &e, Rank lo, Rank hi) const // 无序向量区间查找
    • Vector_search_binary_A.h

      • Rank binSearch ( T* A, T const& e, Rank lo, Rank hi ) // 二分查找算法(版本A):在有序向量的区间[lo, hi)内查找元素e0 <= lo <= hi <= _size,3个判断条件e=V[mid], e.g.
    • Vector_search_binary_B.h

      • Rank binSearch ( T* A, T const& e, Rank lo, Rank hi ) // 二分查找算法(版本B),2个判断条件e<V[mid], e.g.
    • Vector_search_binary_C.h

      • Rank binSearch ( T* A, T const& e, Rank lo, Rank hi ) // 二分查找算法(版本A):2个判断条件e<V[mid], e.g.,有多个命中元素时,总能保证返回秩最大者
    • Vector_search_fibonaccian_A.h

      • Rank fibSearch ( T* A, T const& e, Rank lo, Rank hi ) // Fibonacci查找算法(版本A):在有序向量的区间[lo, hi)内查找元素e0 <= lo <= hi <= _size
    • Vector_search_fibonaccian_A.h

      • Rank fibSearch ( T* A, T const& e, Rank lo, Rank hi ) // Fibonacci查找算法(版本A):在有序向量的区间[lo, hi)内查找元素e0 <= lo <= hi <= _size,3个判断条件(包含等于),利用fibonacci是的左右分支更为平衡
    • Vector_search_fibonaccian_B.h

      • Rank fibSearch ( T* A, T const& e, Rank lo, Rank hi ) // Fibonacci查找算法(版本A):2个判断条件(不含等于),利用fibonacci是的左右分支更为平衡
    • Vector_search.h

      • Rank search(T const &e, Rank lo, Rank hi) const // 随机选用binary search或者fibonacci search
    • Vector_traverse.h

      • void traverse ( void (* ) ( T& ) ) // 遍历(使用函数指针,只读或局部修改)
      • template <typename VST> void traverse ( const VST& ) // 遍历(使用函数对象,可全局修改)
    • Vector_unsort.h

      • void unsort ( Rank lo, Rank hi) // 等概率随机置乱区间[lo, hi)
    • Vector_sort.h

      • void unsort ( Rank lo, Rank hi) // 向量区间[lo, hi)排序,随机选取排序算法
    • vector_bubble.h

      • bool bubble ( Rank lo, Rank hi ) // 冒泡排序一趟扫描,有序标志位
      • Rank bubbleB ( Rank lo, Rank hi ) // 冒泡排序一趟扫描改进(习题2-25),记录向右最后一个逆序元素
      • Rank bubbleC ( Rank lo, Rank hi ) // 冒泡排序一趟扫描改进(习题2-25),记录向左最后一个逆序元素(右向左扫描)
    • vector_bubbleSort.h

      • void bubbleSort(Rank lo, Rank hi) // 冒泡排序
      • void bubbleSortB(Rank lo, Rank hi) // 冒泡排序一趟扫描改进B(习题2-25)
      • void bubbleSortC(Rank lo, Rank hi // 冒泡排序一趟扫描改进C(习题2-25)
    • vector_selectionSort.h

      • void selectionSort ( Rank lo, Rank hi ) //选择排序
    • vector_merge.h

      • void merge(Rank lo, Rank mi, Rank hi) // 归并算法
      • void mergeUniquify(Rank lo, Rank mi, Rank hi) // 归并去重算法
    • vector_partition_a.h // 向量快速排序轴点构造算法a

    • vector_partition_a1.h // 向量快速排序轴点构造算法a1,与a等价

    • vector_partition_b.h // 向量快速排序轴点构造算法b,可优化处理多个关键码雷同的退化情况

    • vector_partition_b2.h // 向量快速排序轴点构造算法b1,等价b

    • vector_partition_c.h // 向量快速排序轴点构造算法c,尽可能保持稳定

    • vector_heapSort.h // 向量快速排序轴点构造算法c,尽可能保持稳定

    • Vector_uniquify.h

      • int Vector<T>::uniquify() // 有序向量重复元素剔除算法
    • Vector_deduplicate.h

      • int deduplicate() // 删除无序向量重复元
      • int deduplicateB() // 删除无序向量重复元,算法B,按互异元素块
      • int deduplicate( Rank lo, Rank hi) // 删除无序向量重复元素O(nlogn)
    • vector_increase.h

      • void increase(Vector<T>& V) //元素+1,函数对象方法
    • vector_decrease.h

      • void decrease(Vector<T>& V) //元素-1,函数对象方法
    • vector_double.h

      • void _double(Vector<T> & V) //元素*2,函数对象方法
    • vector_expSearch.h

      • Rank expSearch(T const &e, Rank lo, Rank hi) const //指数查找习题
    • vector_expSearch.h

      • Rank intpSearch(T const &e, Rank lo, Rank hi) const //差值查找2-24
    • Exercise_2_22_Saddleback.h

      • saddleback(int A[n][n], int x) // saddleback search 马鞍查找(伪代码)
  • bitmap结构及方法

第三章 链表

  • List 结构及方法
    • main.cpp结构及方法

    • list_test.h结构及方法

    • List.h List模板类

    • listNode.h List节点模板类(双向链表形式实现)

    • listNode_implementation.h List节点方法

    • listNode_insertAsSucc.h

      • ListNodePosi(T) ListNode<T>::insertAsSucc(T const &e) // 将e紧随节点之后插入于当前节点所属列表(设有哨兵尾节点trailer)
    • listNode_insertAsPred.h

      • ListNodePosi(T) ListNode<T>::insertAsPred(T const &e) // 将e紧靠当前节点之前插入于当前节点所属列表(设有哨兵头节点header)
    • List_implementation.h List方法实现头文件

    • List_bracket.h

      • T& List<T>::operator[] (Rank r) cosnt // 操作符重载寻秩访问(低效率 O(n) )
    • List_initialize.h

      • void List<T>::init() // 列表初始化,头尾哨兵初始化
    • List_copyNodes.h

      • void List<T>::copyNodes(ListNodePosi(T) p, int n) // 依次作为末节点插入,自p起n项
    • List_constructor_by_copying.h

      • List<T>::List(ListNode<T> *p, int n) // 复制列表中自位置p起的n项
      • List<T>::List(List<T> const& L) // 整体复制列表L
      • List<T>::List(List<T> const& L, Rank r, int n) // 复制L中自第r项起的n项(assert: r+n <= L._size)
    • List_destructor.h

      • List<T>::~List() // 析构函数
    • List_disordered.h

      • int List<T>::disordered() cosnt // 统计逆序相邻元素对的总数
    • List_search.h

      • ListNode<T> * List<T>::search(T const &e, int n, ListNode<T> *p) const // 在有序列表内节点p(可能是trailer)的n个(真)前驱中,找到不大于e的最后者
    • List_insert.h

      • ListNode<T> * List<T>::insertAsFirst(T const &e) // e当作首节点插入
      • ListNode<T> * List<T>::insertAsLast(T const &e) // e当作末节点插入
      • ListNode<T> * List<T>::insertPred(T const &e) // e当作p的后继插入
      • ListNode<T> * List<T>::insertSucc(T const &e) // e当作p的后继插入
    • List_remove.h

      • List<T>::remove(ListNode<T> *p) // 删除合法节点p,返回其数值
    • List_clear.h

      • int List<T>::clear() // 清空列表
    • List_traverse.h

      • void List<T>traverse(void (*visit)(T &)) // 链表遍历(函数指针)
      • void List<T>traverse(const VST & visit ) // 链表遍历(函数对象)
    • List_sort.h

      • void List<T>::sort(ListNode<T> *p, int n) // 随机调用3种排序算法:插入、选择和归并
    • List_insertionSort.h

      • void List<T>::insertonSort(ListNode<T> *p, int n) // 链表的插入排序算法:对起始于位置p的n个元素排序
    • List_selectMax.h

      • ListNode<T> * List<T>::selectMax(ListNode<T> *p, int n) // 从起始于位置p的n个元素中选出最大者
    • List_selectionSort.h

      • void List<T>::selectionSort(ListNode<T>*p, int n) // 链表选择排序算法:对起始于位置p的n个元素排序
    • List_merge.h

      • void List<T>::merge(ListNode<T>* &p, int n, List<T> &L, ListNode<T>* q, int m ) // 链表归并(p, q)
    • List_mergeSort.h

      • void List<T>::mergeSort(ListNode<T>* &p, int n) // 链表归并排序
    • List_deduplicate.h

      • List<T>::deduplicate() // 无序链表去重
    • List_uniquify.h

      • int List<int>::uniquify() // 有序链表去重
    • List_resverse1.h

      • void List<T>::reverse() // 前后倒置1
    • List_reverse2.h

      • void List<T>::reverse() // 前后倒置2
    • List_reverse3.h

      • void List<T>::reverse() //前后倒置3
    • List_increase.h

    • Josephus_3_19.h

      • int josehus(int n, int k) // 习题3-19

第四章 队列和栈

  • convsrsion: 进制转换

    • convert.h // 利用栈进行进制转换
    • convertB.h // 十进制正整数n到base进制的转换(递归版)
  • Stack: 栈类及方法

  • Queue: 队列类及方法

    • main.cpp // 测试程序
    • Queue_test.h // 测试头文件
    • Queue.h // 队列类
      • void enqueue(T const& e) // 入队:尾部插入
      • T dequeue() // 出队:首部删除
      • T & front() // 队首
  • RPN: 逆波兰表达式

    • main.cpp // 测试程序
      • char * removeSpace( char* s) // 删除s[]中的空格
    • rpn.h // 逆波兰表达式方法
    • priority.h // 运算符优先级设置
    • caculation.cpp // 计算
      • float calcu(float a, char op, float b) // 二元运算
      • float calcu (char op, float b) // 一元运算(阶乘)
    • displayprogress.cpp // 显示表达式处理进展
    • readnumber.cpp
      • void readNumber( char*& p, Stack<float>& stk) // 将起始于p的子串解析为数值,并存入操作数栈
    • priority.cpp
      • Operator optr2rank (char op) // 由运算符转译出编号
      • char orderBetween(char op1, char op2) // 比较两个运算符之间的优先级
    • append2rpn.cpp
      • void append ( char*& rpn, float opnd) // 将运算数接到RPN尾部
      • void append(char*& rpn, char optr) // 将运算符接至RPN末尾
    • rpn.cpp
      • float evaluate (char *S, char*& RPN) // 对(已剔除白空格的)表达式S求值,并转换为逆波兰式RPN
  • queen_stack: n皇后问题

    • main.cpp // n皇后迭代版测试
    • queen_stack.h // 方法头文件
    • queen.h // 皇后类
    • place_queens.cpp // N皇后算法(迭代版):采用试探/回溯的策略,借助栈记录查找的结果
    • display_progress.cpp
      • void displayRow ( Queen& q ) // 打印当前皇后(放置于col列)所在行
      • void displayProgress ( Stack<Queen>& S, int nQueen ) // 在棋盘上显示搜查的进展
  • laby: 迷宫问题

第十一章 字符串匹配

_share和_unprint文件为邓老师的测试辅助文件,注释掉了部分内容,随着更新会逐步取消相关注释

Data Sturcture Exercise

UNFINISHED!!!

The code of Data Structures in C++(Junhui Deng, tshinghua university)

The code are code are programed in CLion. Not all the file were compiled.

This repo mainly for record the work I have done. Some codes provided by Prof. Deng is really clever and they could be good reference in future.

Citation

//copyright and some information of Junhui DENG
/*********************************************************************
 * Data Structures in C++
 * ISBN: 7-302-33064-6 & 7-302-33065-3 & 7-302-29652-2 & 7-302-26883-3
 * Junhui DENG, deng@tsinghua.edu.cn
 * Computer Science & Technology, Tsinghua University
 * Copyright (c) 2006-2013. All rights reserved.
***********************************************************************/

Chapter 1: Intorduction

  • 1_Fibonacci

    • Fibonacci sequence (class):

      `get()`: Get current fibonacci value;
      
      `next()`: Get next fibonacci value;
      

      prev(): Get previous fibonacci value

    • 三种计算fibonacci 的方法

      Iteration `long long fibI( int n)`( $O(n)$ );
      
      Binary Recursion `long long fib(int n)`( $O(2^n)$ );
      

      ​ Linear Recursion long long fib(int n, long long &prev)( $O(n)$ )

  • Chapter_1_unrun_code: exercise

    • Fun1_7: A program contains loop, branch, subfunction and recursion

    • Fun1_12: Count the total number of digits 1 in the binary expansion of an integer (Two methods) ( also contained in countones sourcecodes provided by Prof. Deng )

    • Fun1_13: Caculate power function $2^n$ ( brute force recursion $O(2^r)$ ) //r donates the bit length of input data

    • Fun1_14: Caculate power function $2^n$ ( iteration $O(r)$ )//r donates the bit length of input data

    • Fun1_15: Caculate the max value in A[lo, hi)( binary recursion )

    • 1_23_Hanoi: Hanoi problem

    • 1_25_gcdCN: Greatest Common Divisor (GCD)

      The Nine Chapters on the Mathematical Art “中华更相减损术” gcdCN: $O( log(a+b) )$ 
      
      Euclid algorithm, gcd: $O( log(a*b) )$
      
    • 1_26_shift2: move k bits of an array from right to left

    • 1_27_Ackermann: Caculate Ackermann function

    • 1_29_Hailstone: Hailstone sequence

About

数据结构练习/The code of Data Structures in C++(Junhui Deng, tshinghua university)

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors