数据结构与算法

作者: jkCodic | 来源:发表于2017-07-03 22:49 被阅读0次

    数学拾遗 微积分 线性代数 考研:2018启航张宇高数远程面授
    https://leetcode-cn.com/problems/two-sum/description/
    https://blog.csdn.net/zr459927180/article/details/51932655

    前言

    1.算法学习与克服恐惧
    知晓算法形成和实现原理;
    面对新问题为什么胆怯焦虑不安:问题描述定义未明?对概念不熟悉?不够自信?
    解决办法:1.首先明确这些问题就算大神也不是一步就能做出来的,需要积累;
    2.相信自己也有解决这种办法的能力,没有可以积累,不是我不适合,是问题不适合;
    3.会用解决方法就是一种方法,这些才是编程最后的难题,一下解决了编程就没意思了;
    4.算法需要考虑存储空间和内存等问题:比如分段排序
    数据量 有/无序 存在位置是否影响(复杂度分析)

    一 工作中常用算法

    最短路径

    足球控制例子

    哈希表

    目的:为了根据数据的部分内容(关键字),直接计算出存放完整数据的内存地址
    原理:通过某种算法(哈希函数)直接根据关键字计算出元素的存放地址,由于无需遍历,所以效率很高;
    ①哈希函数实现:

    http://blog.chinaunix.net/uid-26548237-id-3483650.html

    http://www.cnblogs.com/polly333/p/4760275.html

    1.排序

    http://forum.eepw.com.cn/thread/280064/1
    浙大数据结构
    http://www.icourse163.org/learn/ZJU-93001?tid=1002019005#/learn/forumindex
    效率:快排》冒泡》插入=选择;
    但快排抵抗垃圾数据能力太差;
    推荐用归并排序,速度仅次于快排,抵抗垃圾数据的能力较强

    目前排列最快的是索引排序(大牛们都这样说的)。
    另外俺知道两种排序方法
    1,就是对数据库直接排序。可以使用sql语句对后端数据排序。使用这种方法我觉得对你那两种情况都一样。
    2,分段读取后端的数据,然后利用DataSet(BCB的牛技术)一类控件的Data属性。首先判断Data中的数据是否已经排序 如果没有排序就排序,然后再读下一段数据,再判断,以此类推。
    那种更快,这得根据实际情况,都有优缺点。

    100万行的数据别说排序,就是读取也是个问题!能否放到StringGrid,即使放得能否滚动查看?
    建议每次读取部分数据,比如按行读取,指定一个索引值,判断第2列数是否和索引对应,如果对应就读入并写入到StringGrid里。

    建议使用快速排序或堆排序。
    如果在外存储器中,可使用归并排序。
    http://bbs.csdn.net/topics/190147318

    归并排序

    未完成
    void Merge(int sourceArr[],int tempArr[],int startIndex,int midIndex,int endIndex)
    {
    int i = startIndex,j=midIndex+1,k=startIndex;
    while(i!=midIndex+1&&j!=endIndex+1)
    {
    if(sourceArr[i]>sourceArr[j])
    tempArr[k++] = sourceArr[j++];
    else
    tempArr[k++] = sourceArr[i++];
    }

    2.插入
    算导看到2.2分析算法 https://pan.baidu.com/disk/home#list/vmode=list&path=%2F%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95%2F%E6%B7%98%E5%AE%9D%E7%AE%97%E5%AF%BC

    二 基本数据结构-栈,队列,二叉树与堆

    堆:malloc申请存储区

    先研究树再图;查找算法扩展思考 例子:8球中有一瑕疵球通过2次称量求出;
    是什么?为什么需要?怎么实现?生活中例子,结合工作,区别(补图 举例 作用 对数据结构的进一步理解:纯软件思路的人为实现,用顺序或链式的存储方式定义数据逻辑结构,思考:数据结构的实现蕴含算法的思想吗)


    红黑树(粤嵌书P273)伸缩性

    下一步:哈希表(适用范围
    快速查找,删除的基本数据结构,通常需要总数据量可以放入内存)
    数据量大有优势-空间换时间

    Hash与Map的区别
    权衡三个因素: 查找速度, 数据量, 内存使用,可扩展性,有序性

    算法速度级别(查找?):常数级O(1)>O(log2n)>n(线性阶)>线性对数阶nlog2n>平方阶n*n>立方阶>k次
    方阶>指数阶(2的n次方)

    算法执行期间所需要的存储空间包括3个部分:
    ·算法程序所占的空间;
    ·输入的初始数据所占的存储空间;
    ·算法执行过程中所需要的额外空间。
    在许多实际问题中,为了减少算法所占的存储空间,通常采用压缩存储技术。

    链表

    单链表(空头)插入节点.png 红线部分什么意思.png

    栈:先进后出

    作用(将一个整数,转换成指定的进制 2 8 16)

    队列:先进先出

    二叉树的遍历

    https://mp.weixin.qq.com/s?__biz=MzAxMTI4MTkwNQ==&mid=2650825031&idx=1&sn=f07a913f332f5ddf2054f7ace0b9ceaa&chksm=80b7b5d9b7c03ccff47951986df91202f5a13a438dc42d05836e3e6591ecbce713e062a92fbd&mpshare=1&scene=1&srcid=0315lbhX4o7l0LE43P32MAHo#rd
    前序,中序,后序,按层
    前序:根---》左---》右
    最开始的根一定是最顶层的那个根节点

      中序:左---》根---》右   如何实现(贝讯笔试)
          最开始的左是图中最底层,最左边的那个左孩子
      后序:左---》右---》根
      按层:从上到下,从左到右
    

    套路:先排能看到的,然后用规则填充;规则很明确,但是结合具体的二叉树去分析的时候,注意:每个节点有多重身份(根,左,右)--->你在套用这些规则的时候,你必须递归地去套用一次口诀
    (应用:树结构.在一个树里找指定的结点.写游戏的时候,我把场景放到节点上,这样出了一个场景,就切到父节点的场景.这个叫做'入口'技术,通过变换节点在树中的位置,打开同一个门,就可以到不同的地方.泛泛的二叉树没怎么用,不过排序二叉树倒是不错,提高查找速度.我在游戏里面用了,很有效果哦:))

    用的最多的应该是平衡二叉树,有种特殊的平衡二叉树红黑树,查找、插入、删除的时间复杂度最坏为O(log n)Java集合中的TreeSet和TreeMap,C++ STL中的set、map,以及Linux虚拟内存的管理,都是通过红黑树去实现的。还有哈夫曼树编码方面的应用。B-Tree,B+-Tree在文件系统中的应用。如有错误或遗漏还请各位指正补充。

    二叉树中的二叉查找树,可以使用 ”中序遍历“ 来排序。

    文件系统和数据库系统一般都采用树(特别是B树)的数据结构数据,主要为排序和检索的效率。二叉树是一种最基本最典型的排序树,用于教学和研究树的特性,本身很少在实际中进行应用,因为缺点太明显了

    二叉树:可为空 (深)度与层 表达式
    三叉树:
    栈:底压栈代表只能弹倒序 题目意思是动态的 不是一个顺序
    图:领接表 广(深)度优先
    快速排序

    三 复杂数据结构

    四 实用算法-无人机工控等(PID学习笔记)

    0.棋牌游戏,多状态条件判断

    百余张棋牌,分花色实时牌面分析


    image.png
    程序思路.png

    https://blog.csdn.net/qq229596421/article/details/51419813
    PID是工业常见控制算法
    比例proportion
    积分integration
    微分differential
    有什么用?怎么实现?应用场景?用C++如何实现?发展及拓展?使用注意问题?

    1.控制算法

    有哪些:二位式控制(弊端:返回值单一 不能达到理想值 延迟 效率低)
    pv(控制对象)当前状态值 sv用户设定(目标)值(按钮或上拉电阻传入设定值给到算法,

    算法输出out去控制负载,负载再将返回值经传感器去到算法)

    2.PID如何解决(思想)

    偏差E=Sv-Pv 不同:历史偏差(存储器) Pv取样值(开机以来每

    隔固定时间与Sv相减然后存储,又分为:历史偏差 当前偏差 最近偏差,叠加三次的值然

    后输出out)

    分析:
    1.开机以来传感器所有的采样点的数据序列
    序列:x1(第一秒钟值) x2.....xk,
    2.分析采样点数据序列,挖掘三方面信息
    ①Ek =Sv-Xk现在时间点传感器回来值与设定值偏差程度

    0:控制没达标
    =0:刚好
    <0:超标

    POUT = Kp*Ek+OUT0 放大偏差 ----比例控制 PWM(脉冲)信号-侧面控制负载 缺陷:值

    相等就失控(没误差控制不了)

    ②Sk = E1+E2+.....Ek-1+Ek //可正可负

    0:大多数时间未达标 =0: <0:
    IOUT=Kp*Sk+OUT0->积分算法(考虑了历史状态)->+OUT0代表历史没有问题
    把问题控制在没有发生之前

    ③最近两次偏差相减 Dk = E(k)-E(k-1)//最后两个数想减

    0: 偏差更大,越来越偏离目标(趋势)
    DOUT = Kp*Dk+OUT0 --微分控制(不能单独行动)

    2.PID算法 -微分和定积分
    2.1 卡尔曼滤波
    2.2最优估计算法

    2.3为什么不用欧拉角来表示旋转而要引入四元数
    一方面是因为欧拉角微分方程中包含了大量的三角运算,这给实时解算带
    来了一定的困难。而且当俯仰角为90度时方程式会出现神奇的“GimbalLock”。
    所以欧拉角方法只适用于水平姿态变化不大的情况,而不适用于全姿态飞行器的姿态确定。
    四元数法只求解四个未知量的线性微分方程组,计算量小,易于操作,是比较实用的工程方法。

    四元数是一种超复数。如把四元数的集合考虑成多维实数空间的话,四元数就代表
    k i j 着一个四维空间,相对于复数为二维空间。
    简而言之,四元数包含了刚体旋转的所有信息,而在四旋翼飞行器的姿态解算中,
    往往使用的是四元数微分方程对四元数进行更新

    define Kp 2.0f //加速度权重,越大则向加速度测量值收敛越快

    define Ki 0.001f //误差积分增益

    五 STL

    Vector向量容器 动态数组 节省存储

    iterator迭代器 智能指针 被其它嵌入内部

    六 图

    算导2.2答案 http://www.cnblogs.com/geniuspig/p/7215503.html
    http://www.bianceng.cn/Programming/C/201306/36691.htm
    http://www.jb51.net/article/55232.htm
    http://blog.csdn.net/myan/article/details/649018
    http://www.bianceng.cn/Programming/C/201306/36691.htm

    应用实例

    1.广州BRT

    实时到站信息 大站熟悉-小路 灵活性 通用快速出门时段

    2.音视频传输

    压缩算法

    效率 完整性 tencent图形压缩

    图像处理算法

    相关文章

      网友评论

        本文标题:数据结构与算法

        本文链接:https://www.haomeiwen.com/subject/wugjottx.html