算法
河大吴彦祖
C#设备芯片制造设备工程师
展开
-
知识点10:c++中的移位运算,左移和右移
之前写一道二分查找的题目是,有一个问题一直过不去,问题是这样的:假设left=0,right=2计算mid=left+((right-left)>>2)正常情况下mid=1,但是上述式子mid=0移位运算包含“逻辑移位”(logical shift)和“算术移位”(arithmetic shift)逻辑移位: 移出去的位丢弃,空缺位(vacant bit)用 0 填充算术移位: 移出去的位丢弃,空缺位(vacant bit)用“符号位”来填充,一般用在右移运算中无符号数,不原创 2021-03-30 17:12:56 · 837 阅读 · 0 评论 -
图的存储结构总结
点这里原创 2021-01-12 20:31:03 · 149 阅读 · 0 评论 -
知识点9:if(x==nullptr)和if(x)的区别
if和while都是判断形语句,因此当括号中为0,则表示false不执行。括号中为1则表示true,执行例如:if(root != nullptr)和if(root)一个意思 if(root==nullptr)和if(!root)一个意思真-true-非0假-false-0原创 2021-01-05 20:35:42 · 1300 阅读 · 2 评论 -
知识点8:二叉树根据节点的val值返回对应的节点
递归和非递归的方式我都试过了,发现递归的方式比较难实现而且麻烦,因此用非递归(栈)结构的方法给出BTree* return_by_val(int val,BTree *root) { stack<BTree*> s; BTree* cur = root; while (cur!=nullptr||!s.empty()) { while (cur!=nullptr) { s.push(cur); cur = cur->left; } if (cur==nu原创 2020-12-22 20:32:21 · 851 阅读 · 0 评论 -
知识点7:二叉树(树)如何获取当前节点的父亲节点×
1原创 2020-12-22 19:53:30 · 2673 阅读 · 0 评论 -
知识点6:二叉搜索树BST的删除
二叉排序树的性质根节点的左孩子都比根节点要小,根节点的右孩子都比根节点要大这个性质随着二叉树一次递归下去,每一个子树都满足这个性质BST树的结构如下:(1)所有左子树中的节点小于等于根节点(2)所有右子树中的节点大于等于根节点(3)对于任意节点满足(1)(2)删除BST的删除难点在于删除节点后,剩下的树要维持BST的性质因此,删除BST的某个节点要根据节点的情况分为以下三种一、删除节点为叶子节点例如删除上述的13、22、19、42节点这些节点为叶子节点,删除这些节点不会影响到BST原创 2020-12-22 19:22:47 · 665 阅读 · 0 评论 -
知识点5:为什么知道先序和后序不等重建二叉树
我们无法根据树的先序遍历和树的后序遍历得到二叉树的结构,或者说结构是不确定的单向陷门函数思想hash函数的功能就是将某个大集合映射到小集合中,例如布隆过滤器或者布谷鸟过滤器。或者我们的一些密码的存储,并不是在数据库中直接放入我们的密码,这样如果数据库被盗或者丢失会造成很严重的损失。那么数据库上存储的密码实际上是我们密码的hash映射或某种加密下的密文。既然是单向的就说明我们无法从以映射的集合得到原集合。同时这种压缩是有损的。因此一棵树也可以看做是一个哈希映射。我们将含有n个节点的二叉树映射成为串长为原创 2020-12-08 19:38:25 · 622 阅读 · 0 评论 -
知识点4:bool值的一些理解
1.布尔值的0代表false非零整数(不论正负)代表true2若有一个指针p为nullptr或者NULL则p的布尔值为0,则!p为1,为truep==nullptr和!p是等价的表达原创 2020-11-02 13:48:53 · 701 阅读 · 0 评论 -
知识点2:多项式时间
时间复杂度通俗的理解:时间复杂度并不是表示一个程序解决问题需要花多少时间,而是当问题规模扩大后,程序需要的时间长度增长得有多快。也就是说,对于高速处理数据的计算机来说,处理某一个特定数据的效率不能衡量一个程序的好坏,而应该看当这个数据的规模变大到数百倍后,程序运行时间是否还是一样,或者也跟着慢了数百倍,或者变慢了数万倍。不管数据有多大,程序处理花的时间始终是那么多的,我们就说这个程序很好,具有O(1)的时间复杂度,也称常数级复杂度;数据规模变得有多大,花的时间也跟着变得有多长,这个程序的时间复杂度就是O原创 2020-10-28 09:29:54 · 1224 阅读 · 0 评论 -
知识点1:节点(树)的高度(深度)求法
树的高度是从当前节点到叶子结点的路径双重递归的求法:class Solution {public: //递归写法 int maxDepth(TreeNode* root) { if(root==NULL){ return 0; } int l=maxDepth(root->left)+1; int r=maxDepth(root->right)+1; return l&g原创 2020-10-27 21:27:09 · 3929 阅读 · 0 评论 -
知识点3:return a||b ; return a&&b的区别
||和&&都遵循短路运算规则因此:return a||b的意思就是如果a是true则返回a,否则返回breturn a&&b的意思就是如果a是false就则返回a,否则返回b扩展:实质上来说,||和&&这两个运算符分别叫做短路或和短路与,因此他们都是短路运算符。&和&&&: 两边可以是int类型也可以是bool类型。当两边是int类型的时候则表示与运算。当时bool类型的时候,要求两侧全为真的时候才会是真,其余原创 2020-10-27 21:08:22 · 2322 阅读 · 0 评论 -
对于双递归的理解
双递归其实实质上还是一种递归形式,只要把握住递就是函数的出栈入栈就行接下来看几个例子:example1:void rec(int n) { if (n>0) { rec(n - 1);//rec1 rec(n - 10);//rec2 } cout << n << endl;}原创 2020-10-27 19:59:37 · 2996 阅读 · 4 评论 -
算法分析中的增长数量级和近似函数
算法分析中的近似函数描述近似函数调和级数求和Hn=1+1/2+1/3+1/4+······+1/N~lnN等差数列求和1+2+3+4+······+N~N²/2等比数列求和1+2+4+8+······+2ⁿ~2ⁿ斯特灵公式lgN!=lg1+lg2+lg3+lg4+······+lgN~NlgN增长数量级的分析描述增长的数量级典型代码说明举例常数级别1a=b+c完成任务所需的操作数一定将两个数相加对数级别logN原创 2020-09-22 18:35:43 · 1167 阅读 · 0 评论 -
c++实现二叉树遍历(递归和非递归)
递归遍历二叉树遍历的递归表示法非常简单,遵循遍历顺序即可#ifndef RECURSIVE_H_#define RECURSIVE_H_#include"construct_binary_tree.h"#include<iostream>using namespace std;class RecurisveTree {public: RecurisveTree(); ~RecurisveTree(); void PreTraverse(BinaryTree *T); vo原创 2020-09-17 20:05:37 · 250 阅读 · 0 评论 -
c++实现队列(顺序队列和栈队列)
和栈的实现有些不同的是,在链队列中使用了两个指针,一个指向队尾一个指向队首顺序队列#ifndef ARRAYQUEUE_H_#define ARRAYQUEUE_H_#include<iostream>using namespace std;class Arr_Queue {public: Arr_Queue(); ~Arr_Queue(); void enQueue(int n); int pop(); int front(); int rear(); void i原创 2020-08-22 14:56:43 · 214 阅读 · 0 评论 -
c++实现栈结构(顺序栈和链栈)
顺序栈思路: 内部使用数组,入栈的时候在数组后面添加值,出栈的时候数组的指针从后往前移动。唯一的难点在于如何动态的扩展数组代码:#ifndef ARRAYSTACK_H_#define ARRAYSTACK_H_#include<iostream>using namespace std;class ArrayStack {public: ArrayStack(); ~ArrayStack(); void push(int n); int pop(); void trav原创 2020-08-21 19:29:56 · 227 阅读 · 0 评论 -
所有的排序算法总结
总结n: 数据规模k: “桶”的个数In-place: 占用常数内存,不占用额外内存Out-place: 占用额外内存插入排序直接插入排序(Straight Insertion Sort)思路:将一个记录插入到已经排好序的有序表中动画演示:代码:第一种方法:void Straight_Insertion_Sort(int a[],int length){ for (int i = 1;i < length;i++) { if (a[i]<a[原创 2020-08-20 22:58:01 · 1047 阅读 · 0 评论