美文网首页
算法学习 (一)

算法学习 (一)

作者: 那不是随你 | 来源:发表于2018-03-27 14:57 被阅读0次

也许只是在知乎闲逛心血来潮的看到了这篇文章 怎么学算法,突然意识到自己算法方面的薄弱。大学学习的就是计算机方面的专业,但是不管是C,C++,都没好好学过,更别说算法了,虽然我现在从事iOS开发~,从最开始入职工作,到意识深度学习提升个人价值,再到各类面试的问题,算法总是有围绕在身体,但是我从来都是刻意的去回避这些问题,导致我现在最基础的算法我都不能够很好应付。
年前看了 怎么学算法 之后,我毅然决然的买了两本算法书,《算法》(第四版),《算法导论》,我从《算法》开始,很多人都这个能为之后看算法导论打下一定基础(毕竟我的基础太差)。因为我的自律性一直不太好,以此记录,来督促自己保持学习的习惯。并且能够有所得,而不是吃了又吐回去。

算法

算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度时间复杂度来衡量。

特征

一个算法应该具有以下五个重要的特征:

有穷性

(Finiteness)

算法的有穷性是指算法必须能在执行有限个步骤之后终止;

确切性

(Definiteness)

算法的每一步骤必须有确切的定义;

输入项

(Input)

一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件;

输出项

(Output)

一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的;

可行性

(Effectiveness)

算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步,即每个计算步都可以在有限时间内完成(也称之为有效性)。

要素

一,数据对象的运算和操作:计算机可以执行的基本操作是以指令的形式描述的。一个计算机系统能执行的所有指令的集合,成为该计算机系统的指令系统。一个计算机的基本运算和操作有如下四类:

1,算术运算:加减乘除等运算

2,逻辑运算:或、且、非等运算

3,关系运算:大于、小于、等于、不等于等运算

4,数据传输:输入、输出、赋值等运算

二,算法的控制结构:一个算法的功能结构不仅取决于所选用的操作,而且还与各操作之间的执行顺序有关。

评定

同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。一个算法的评价主要从时间复杂度空间复杂度来考虑。

时间复杂度

算法的时间复杂度是指执行算法所需要的计算工作量。一般来说,计算机算法是问题规模n 的函数f(n),算法的时间复杂度也因此记做。

T(n)=Ο(f(n))

因此,问题的规模n 越大,算法执行的时间的增长率与f(n) 的增长率正相关,称作渐进时间复杂度(Asymptotic Time Complexity)。

空间复杂度

算法的空间复杂度是指算法需要消耗的内存空间。其计算和表示方法与时间复杂度类似,一般都用复杂度的渐近性来表示。同时间复杂度相比,空间复杂度的分析要简单得多。

正确性

算法的正确性是评价一个算法优劣的最重要的标准。

可读性

算法的可读性是指一个算法可供人们阅读的容易程度。

健壮性

健壮性是指一个算法对不合理数据输入的反应能力和处理能力,也称为容错性


基础部分

一.数据结构
主要学习了三种基础的抽象数据类型:背包、队列、栈。以及使用链表实现背包、队列、栈。

//基础 创建链表
class Node: NSObject {
    var item:Any?
    var next:Node?
    
}

//背包
class STBag: NSObject {
    fileprivate var first:Node?
    fileprivate var count:Int = 0
    
    public func add(_ item:Optional<Any>){
        if (first != nil)
        {
            let oldfirst = first
            first = Node.init()
            first!.item = item as AnyObject
            first!.next = oldfirst
        }
        else
        {
            first = Node()
            first?.item = item as AnyObject
        }
        count = count+1
    }
  
    func isEmpty() -> Bool {
        return count != 0
    }
    func size() -> Int {
        return count
    }
    
}

//栈
class STStack: NSObject {
    fileprivate var first:Node?
    fileprivate var count:Int = 0
    
    public func push(_ item:Optional<Any>){
        if (first != nil)
        {
            let oldfirst = first
            first = Node.init()
            first!.item = item as AnyObject
            first!.next = oldfirst
        }
        else
        {
            first = Node()
            first?.item = item as AnyObject
        }
        count  = count+1
    }
    
    public func peek()->Optional<Any>{
        return first?.item
    }
    
    
    
    public func pop() -> Any?{
        if (count>0)
        {
            let item = first?.item
            first = first?.next
            count = count - 1
            return item
        }
        else
        {
            return nil
        }
    }
    
    public  func isEmpty() -> Bool {
        return count != 0
    }
    public func size() -> Int {
        return count
    }
    
}
//队列
class STQueue: NSObject {
    fileprivate var fisrt:Node?
    fileprivate var last:Node?
    fileprivate var count:Int = 0
    
    public func enqueue(_ item:Optional<Any>){
        if (count != 0){
            let oldlast = last
            last?.item = item
            last?.next = nil
            oldlast?.next = last
            count = count + 1
        }
        else{
            let itemNode = Node()
            itemNode.item = item
            last = itemNode
            fisrt = last
            count = count + 1
        }
        
    }
    
    public func dequeue()->Node?{
        if (count != 0){
            let item = fisrt?.item
            fisrt = fisrt?.next
            count = count - 1
            return item as? Node
        }
        else {
            last = nil
            return nil
        }
        
        
    }
    
    
    public  func isEmpty() -> Bool {
        return count != 0
    }
    public func size() -> Int {
        return count
    }
    
}

二.算法分析

  1. 科学方法
  • 细致观察特点,经过精确的测量
  • 根据观察结果提出假设模型
  • 根据模型预测未来的时间
  • 继续观察并核实预测的准确性
  • 反复知道确认预测和观察一致
  1. 观察
  • 计时器
  • 实验数据分析
  1. 数学模型
  • 执行每条语句的耗时
  • 执行每一条语句的频率
  1. 增长数量级的分类
  • 常数级别
  • 对数级别
  • 线性级别
  • 线性对数级别
  • 平方级别
  • 立方级别
  • 指数级别

也许不是每天记录一堂算法学习记录,一定会以高频率的方式记录总结实践学习到知识
Demo地址:https://github.com/StoneAi/Algorithms
持续更新

相关文章

  • 机器学习(1)——几个基本要素

    学习算法 什么是学习算法,学习当然不是一个动词,学习算法最简单的理解便是能够从数据中学习的算法,学习的解释根据 M...

  • StanFord 机器学习公开课笔记(4):生成学习算法

    本讲视频及讲义链接 生成学习算法 生成学习算法和判别学习算法的区别 判别学习算法(Discriminative) ...

  • 谁能看懂这个

    机器学习算法盘点:人工神经网络、深度学习 机器学习的算法很多。很多时候困惑人们都是,很多算法是一类算法,而有些算法...

  • 朴素贝叶斯(Naive Bayes)

    一. 生成式(generative)学习算法 如果算法直接学习,或者尝试学习从输入空间到类别的映射关系的算法,称为...

  • 机器学习算法分类大全

    机器学习算法可以分为监督学习算法、无监督学习算法和半监督学习算法,下面以思维导图的形式总结了一下常见的监督学习和无...

  • 算法概述

    算法是什么 为什么要学习算法 怎样学习算法 算法是什么 算法是计算机用来解决问题的一系列指令。(1)算法的每一个步...

  • 降维与PCA算法

    前言 在之前的学习中,已经学习了无监督学习中的K均值算法。除此算法之外,无监督学习还有另外一种新的算法,该算法被称...

  • 机器学习实战之AdaBoost元算法

    今天学习的机器学习算法不是一个单独的算法,我们称之为元算法或集成算法(Ensemble)。其实就是对其他算法进行组...

  • Adaboost算法

    AdaBoost是典型的Boosting算法。Boosting提升算法,是将“弱学习算法“提升为“强学习算法”的过...

  • 100天搞定机器学习|Day57 Adaboost知识手册(理论

    Boosting算法 Boosting是一种用来提高弱分类器准确度的算法,是将“弱学习算法“提升为“强学习算法”的...

网友评论

      本文标题:算法学习 (一)

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