【好书共享】《算法图解》让算法变得有趣

阅读计划

Panda姐这个星期每天花了一个小时看这本书,到今天看到了第四章,总该对算法有点认知了。《算法图解》这本书比《算法》、《算法导论》看起来有趣易懂多了,里面读了写漫画式的算法解读。二分查找在我们生信技能树的编程实战中涉及到过,后面的贪婪算法、动态规划、K最邻算法在生信软件文章中都能时常能看到。下图中表明为掌握的内容,希望大家购入此书时重点学习。

阅读计划

Panda姐的学习笔记

第一章 算法简介

曾经实验室编程学习之风,盛极一时。常见大家用各自的语言进行编程来解决同一个需求,一般的情况下是perl最快,Python次之,R最慢。除了语言导致问题解决时间多少,然后就是算法啦。在我的                【R】Project Euler通关打怪兽:http://shemy.site/2017/11/20/The-projecteuler-practice/ 文章中,很多时候我解决问题的方法并不是最好,绝大所数是能得到答案,运行时间相当的长。现在让我回过头去做的话,我会想着用哪种算法速度更快,找到更优的解决办法。

### 二分法
binary_search <- function(list,item){
  low = 1
  high = length(list)
  while(low <= high){
    mid = (low+high)/2
    guess = list[mid]
    if(guess == item){
      return(mid)
    }
    if(guess >item){
      high = mid
    }else{
      low = mid
    }
  }
  return("none")
}

my_list <- c(1,3,5,7,9)
binary_search(my_list,7)
my_list[4]

# 练习
# 1.1 假设有一个包含128个名字的有序列表,你要使用二分查找在其中查找一个名字,请问最多需要几步才能找到?
log2(128)
# 最多需要7步
# 1.2 上面列表的长度翻倍后,最多需要几步?
log2(128*2)
# 翻倍后,最多需要8步

第二章 选择排序

Panda姐写代码从来不考虑内存的问题,能把数据格式整理好就好了。反正不懂内存的工作原理,今天一看略懂略懂。

findSmallest <- function(arr){
  smallest = arr[1]
  smallest_index = 1
  for (i in 1:length(arr)){
    if(arr[i] < smallest){
      smallest = arr[i]
      smallest_index = i
    }
  }
  return(smallest_index)
}

selectionSort <- function(arr){
  newArr = c()
  for(i in 1:length(arr)){
    smallest = findSmallest(arr)
    newArr[i] = arr[smallest]
    arr = arr[-smallest]
  }
  return(newArr)
}

selectionSort(c(5,3,6,2,10))

第四章 快速排序.png

这章的快速排序函数,我竟然忘记怎么筛选向量了,看的书全还忘了,计划最近去重新翻翻以前看的R入门书啦~

#函数:quickSort()
#功能:快速排序
#思路:对向量(5,4,12,13,3,8)排序。首先将所有元素跟第一个元素5进行比较,
# 从而形成两个子向量:一个由小于5的元素组成(4,3),一个由大于5元素组成(12,13,8)。
# 然后在子向量上递归调用quickSort(),返回(3,4),(8,12,13),最后将两个子向量和5一起组合得到向量(3,4,5,8,12,13)
# 来源:    https://blog.csdn.net/firparks/article/details/50562400 
-------------------------------------------------------------------------------------------------------------
quickSort<-function(x)
{
  if(length(x)<=1) return(x)
  point<-x[1]
  t<-x[-1]
  sv1<-t[t<point]
  sv2<-t[t>=point]
  sv1<-quickSort(sv1)
  sv2<-quickSort(sv2)
  return(c(sv1,point,sv2))
}

quickSort(c(5,4,12,13,3,8))

#函数:quickSort()
#功能:快速排序
#思路:对向量(5,4,12,13,3,8)排序。首先将所有元素跟第一个元素5进行比较,
# 从而形成两个子向量:一个由小于5的元素组成(4,3),一个由大于5元素组成(12,13,8)。
# 然后在子向量上递归调用quickSort(),返回(3,4),(8,12,13),最后将两个子向量和5一起组合得到向量(3,4,5,8,12,13)
# 来源:    https://blog.csdn.net/firparks/article/details/50562400 
-------------------------------------------------------------------------------------------------------------
quickSort<-function(x)
{
  if(length(x)<=1) return(x)
  point<-x[1]
  t<-x[-1]
  sv1<-t[t<point]
  sv2<-t[t>=point]
  sv1<-quickSort(sv1)
  sv2<-quickSort(sv2)
  return(c(sv1,point,sv2))
}

quickSort(c(5,4,12,13,3,8))

(0)

相关推荐

  • Python中几种常见的排序算法?

    公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助! 小猿会从最基础的面试题开始, ...

  • C 实现主流的几个排序算法

    排序算法是笔试中常考的题目,很多面试者背了整个算法代码,过一段时间就又忘记了. 面试者在面试过程中往往处于一种比较紧张的状态, 若对代码不是很熟悉的话, 基本很难完整编写排序算法代码. 小编最近也在看 ...

  • 美团面试:请手写一个快排,被我怼了!

    大家好,我是田维常,十年码农给你分享后端开发技术,记得关注我. 前面分享8篇,关于2017年,我去上海美团面试遇到的技术问题. 美团面试:熟悉哪些JVM调优参数,幸好我准备过! 美团面试:讲清楚MyS ...

  • 「排序算法」—图解双轴快排

    首发公众号:bigsai 前言 在排序算法中,快排是占比非常多的一环,但是快排其思想一直被考察研究,也有很多的优化方案.这里主要讲解双轴快排的思想和实现. 首先,双轴快排也是一种快排的优化方案,在JD ...

  • 前端笔试题——手撕快速排序(保姆级手撕)

    引言: 许多互联网公司在招聘前端开发人才时,不仅考察面试者对于前端知识的掌握程度,数据结构与算法也渐渐成为了默许的要求. 除了考察链表.二叉树.图等数据结构以外,在算法中最具有代表性的就是" ...

  • 资源分享—数据结构与算法|图解算法题典【附下载】

    AI研习图书馆,发现不一样的精彩世界 资源 分享 图解算法题典 最近,在学习数据结构的时候,又发现了一个宝藏资源,立马一键三连,回来分享给大家~ 2020年,疫情突如其来,给我们带来了许多困难与挑战. ...

  • 小学数学|6大速算法,让计算变得如此简单!

    数学速算法指利用数与数之间的特殊关系进行较快的加减乘除运算.这种运算方法称为速算法,心算法.数学速算法简化了笔算,加强了口算.简单,易学,趣味性强,学习更有趣,小学生通过短时间培训后,多位数加,减,乘 ...

  • 马前课12指算法图解

    图片找不到啦~ 490x271 新浪博客 版权可能受到保护 查看原图 图片找不到啦~

  • 像小说一样有趣的算法入门书籍:《算法图解》

    所有人都在说算法很难,今天给大家推荐一本简单.易懂.有趣的算法入门书籍--<算法图解> 这本书适合具备编程基础并理解算法的人阅读

  • 《算法图解》.pdf

    算法是什么? 算法是按照设定程序运行以获得理想结果的一套指令. 计算机的发明使算法的功能被极大提升,因为在做重复性工作时,计算机显然更具优势,而人们要做的是运用计算机语言将众多极为简单的指令组成非常复 ...

  • 图解排序算法(二)之希尔排序

    希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法.希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一 ...

  • 那些惊艳的算法—时间轮算法

    从定时任务说起 自然界中定时任务无处不在,太阳每天东升西落,候鸟的迁徙,树木的年轮,人们每天按时上班,每个月按时发工资.交房租,四季轮换,潮涨潮落,等等,从某种意义上说,都可以认为是定时任务. 大概很 ...

  • 五大基本算法之动态规划算法 DP dynamic programming | Echo Blog

    dynamic programming 动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法. 20世纪50年代初美 ...

  • 普里姆算法 克鲁斯卡尔算法 简析

    普里姆算法的思想是随便选一个点,然后看他周围的点,找一个最小的路径连接的另一个点,再将这个点吃进去,然后现在你的集合有两个点,将你拥有的两个点看做一个大结点(类似与电路中大平面的KCL推广形式),再找 ...