寒假学习总结

巩固了数据结构知识,对二叉树,图,哈希表等等有了更深刻的认识,以及学习了新的数据结构知识,如广义表
广义表是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

除了内容,寒假学习方面还是存在其他问题的,比如在家的学习状态明显相较于学校松懈了下来,学习时间并没有充分利用.这种情况在寒假结束后应当会有明显好转

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值