初识算法(算法学习)


活动地址:CSDN21天学习挑战赛

学习日记
1,算法入门

1 ,什么是算法

算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出(官方解释)

小编通过学习觉得算法其实就是咋们上学时解数学题过程,用已知条件去获取答案。为了获取结果而走的过程便算是算法了。

2,算法的意义

计算机无限快,并且计算机存储容器是免费的,我们还需要各种乱七八糟的算法吗?如果计算机无限快,那么对于某一个问题来说,任何一个都可以解决他的正确方法都可以的!

当然,计算机可以做到很快,但是不能做到无限快,存储也可以很便宜但是不能做到免费。

那么问题就来了效率:解决同一个问题的各种不同算法的效率常常相差非常大,这种效率上的差距的影响往往比硬件和软件方面的差距还要大。就好像求婚的方式有很多,但是有的办法却不能即使凑效一样。

3,算法中的一些概念

  • 数据结构
    数据结构是相互之间存在一种或多种特定关系的数据元素的集合,即带“结构”的数据元素的集合。“结构”就是指数据元素之间存在的关系,分为逻辑结构和存储结构。

    那么说到算法在基础里为什么包括数据结构呢?那是应为算法的设计取决于数据的逻辑结构,而算法的实现依赖于指定的存储结构。说白了你要做两个整数的相加,那就用两个整数去定义,而不是用浮点,集合之内的,并不是用其他方式不可以算出相加,而时在实现算法的过程中合适的数据结构才能实现最有效的算法。

    常用的数据结构

    数组(Array)
    数组是一种聚合数据类型,它是将具有相同类型的若干变量有序地组织在一起的集合。数组可以说是最基本的数据结构,在各种编程语言中都有对应。一个数组可以分解为多个数组元素,按照数据元素的类型,数组可以分为整型数组、字符型数组、浮点型数组、指针数组和结构数组等。数组还可以有一维、二维以及多维等表现形式。

    栈( Stack)
    栈是一种特殊的线性表,它只能在一个表的一个固定端进行数据结点的插入和删除操作。栈按照先进后出或后进先出的原则来存储数据,也就是说,先插入的数据将被压入栈底,最后插入的数据在栈顶,读出数据时,从栈顶开始逐个读出。栈在汇编语言程序中,经常用于重要数据的现场保护。栈中没有数据时,称为空栈。

    队列(Queue)
    队列和栈类似,也是一种特殊的线性表。和栈不同的是,队列只允许在表的一端进行插入操作,而在另一端进行删除操作。一般来说,进行插入操作的一端称为队尾,进行删除操作的一端称为队头。队列中没有元素时,称为空队列。

    链表( Linked List)
    链表是一种数据元素按照链式存储结构进行存储的数据结构,这种存储结构具有在物理上存在非连续的特点。链表由一系列数据结点构成,每个数据结点包括数据域和指针域两部分。其中,指针域保存了数据结构中下一个元素存放的地址。链表结构中数据元素的逻辑顺序是通过链表中的指针链接次序来实现的。

    树( Tree)
    树是典型的非线性结构,它是包括,2个结点的有穷集合K。在树结构中,有且仅有一个根结点,该结点没有前驱结点。在树结构中的其他结点都有且仅有一个前驱结点,而且可以有两个后继结点,m≥0。

    图(Graph)
    图是另一种非线性数据结构。在图结构中,数据结点一般称为顶点,而边是顶点的有序偶对。如果两个顶点之间存在一条边,那么就表示这两个顶点具有相邻关系。

    堆(Heap)
    堆是一种特殊的树形数据结构,一般讨论的堆都是二叉堆。堆的特点是根结点的值是所有结点中最小的或者最大的,并且根结点的两个子树也是一个堆结构。

    散列表(Hash)
    散列表源自于散列函数(Hash function),其思想是如果在结构中存在关键字和T相等的记录,那么必定在F(T)的存储位置可以找到该记录,这样就可以不用进行比较操作而直接取得所查记录。
  • 算法的效率
    算法效率是指算法执行的时间,算法执行时间需通过依据该算法编制的程序在计算机上运行时所消耗的时间来度量。在提到散发效率时有《时间复杂度》《空间复杂度》。
  • 伪代码约定
    伪代码是用来描述算法执行的步骤,不会具体到某一种语言,为了表达清晰和标准化,会有一些约定的含义:
    缩进:表示块结构,如循环结构或选择结构,使用缩进来表示这一部分都在该结构中。

    循环计数器:对于循环结构,在循环终止时,计数器的值应该为第一个超出界限的值。

    to:表示循环计数器的值增加。

    downto:表示循环计数器的值减少。

    by:循环计数器的值默认变化量为1,当大于1时可以使用by。变量默认是局部定义的。

    数组元素访问:通过"数组名[下标]"形式,在伪代码中,下标从1开始("A[1]“代表数组A的第一个元素)。

    子数组:使用”…"来代表数组中的一个范围,如"A[i…j]"代表从第i个到第j个元素组成的子数组。

    对象与属性:复合的数据会被组织成对象,如链表包含后继(next)和存储的数据(data),使用“对象名 + 点 + 属性名”。

    特殊值NIL:表示指针不指向任何对象,如二叉树节点无子孩子可认为左右子节点信息为NIL。

    return:返回到调用过程的调用点,在伪代码中允许返回多个值。

    and和or:与运算和或运算默认短路,即如果已经能够确定表达式结果时,其他条件不会去判断或执行。

    简单搞个小例子
    do x ← x + 1
    
    y ← x + y
    
    for t ← 0 to y
    

4,实操

  • 从1到10的数字中找出偶数
  • 从c#源码 

 

  static void Main(string[] args)
        {
             int[]  a = {1,2,3,4,5,6,7,8,9,10 };
            foreach (int item in a)
            {
                Console.WriteLine(a[0]);
            }

        }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值