巩固了数据结构知识,对二叉树,图,哈希表等等有了更深刻的认识,以及学习了新的数据结构知识,如广义表
广义表是n(n≥0)个元素a1,a2,…,ai,…,an的有限序列
其中:
①ai–或者是原子或者是一个广义表
②广义表通常记作:
Ls=( a1,a2,…,ai,…,an)
③Ls是广义表的名字,n为它的长度
④若ai是广义表,则称它为Ls的子表
广义表中放松对表元素的原子限制,容许它们具有其自身结构
一般使用链表存储广义表
使用链表存储广义表,首先需要确定链表中节点的结构.由于广义表中可同时存储原子和子表两种形式的数据,因此链表节点的结构也有两种.
tag 标记位用于区分此节点是原子还是子表,通常原子的 tag 值为 0,子表的 tag 值为 1.子表节点中的 hp 指针用于连接本子表中存储的原子或子表,tp 指针用于连接广义表中下一个子表
以及学习了新的算法,例如快速排序,双指针,回溯算法,动态规划等等
其中大部分是在做leetcode题的过程中不断研究与分析掌握的
如快速排序,其便运用到了双指针与递归思想来完成数据排序.
取区间中最左或最右边的元素为key,定义两个变量,这里假设是p和q,q从区间的最右边向左走,找到比key小的元素就停下.p从最左边向右走,找到比key大的元素就停下.然后交换p和q所指向的元素,便完成了排序
int PartSort1(int* a, int left, int right)
{
int key = left;//取最左边的元素做key
while (left < right)//当左右没有相遇
{
while (left < right && a[right] >= a[key])//如果右比key小就退出循环
right--;
while (left < right && a[left] <= a[key])//如果左比key大就退出循环
left++;
swap(&a[left], &a[right]);//交换左右
}
swap(&a[key], &a[left]);//交换key和相遇位置的元素
return left;//返回key的位置
}
而回溯算法本质上就是穷举法,其按深度优先策略搜索问题的解空间树,首先从根节点出发搜索解空间树,当算法搜索至解空间树的某一节点时,先利用剪枝函数判断该节点是否可行(即能得到问题的解),如果不可行,则跳过对该节点为根的子树的搜索,逐层向其祖先节点回溯;否则,进入该子树,继续按深度优先策略搜索
void backtrack (int t)
{
if (t>n) output(x); //叶子节点,输出结果,x是可行解
else
for i = 1 to k//当前节点的所有子节点
{
x[t]=value(i); //每个子节点的值赋值给x
//满足约束条件和限界条件
if (constraint(t)&&bound(t))
backtrack(t+1); //递归下一层
}
学习过程中我发现语言只不过是基本,而想要编写优秀程序更需要数据结构和算法知识与思想的支持,其主要依赖自身素质和经验,所以寒假我还主要在学习新算法和数据结构,而编程语言我想到分方向时再具体决定选择c++还是java
除了内容,寒假学习方面还是存在其他问题的,比如在家的学习状态明显相较于学校松懈了下来,学习时间并没有充分利用.这种情况在寒假结束后应当会有明显好转