项目作者: pengliheng

项目描述 :
learn data-construct and algorithms in javascript
高级语言: JavaScript
项目地址: git://github.com/pengliheng/javascript-algorithms.git
创建时间: 2018-07-15T15:14:01Z
项目社区:https://github.com/pengliheng/javascript-algorithms

开源协议:

下载


总的来说

program = algorithms + structures

前言

什么样的人需要学习数据结构与算法

  • 不希望只是做增删改查的重复劳动工作
  • 想参加ACM竞赛(非常有含金量的3人团队比赛)
  • 非科班出生在被人安利了无数次《算法导论》后望而却步的同学
  • 在通往人工智能的道路上被传统算法绊住脚的同学
  • 备战明年校招 or 跳槽时被考察算法的同学
  • 对算法学习感到迷茫,不知道学了能干嘛的同学。
  • 当你脑海中莫名蹦出个想法,这个问题需要用到算法才能解决,这个时候,就是需要去学习的时候了.

学习技巧

学习算法与数据结构需要注意的是,切勿盲目追求某个特别难的问题,优先系统性学习,掌握大而全,不必细化,
  • 系统性学习知乎live
  • 应用,找类似于leetcode之类的题库
  • 思考,取若干同类型的思考题,独立完成,
  • 思考,思考,再思考

学习时间分配方式,自己掂量

  • 普通人: 1/4睡觉 3/4学习,
  • 大神: 1/5打游戏 3/10睡觉 1/2学习,
  • 打酱油: 1/5睡觉 3/10打游戏 1/2学习,

学习传统算法对以后的帮助

基础扎实,coding速度质量都有极大保障

  • 中间件开发,可胜任造轮子的岗位
  • 极大降低加班时间,提升程序员生活幸福感

解决问题能力强,拥有较高计算机思维

  • 擅长使用树,图等非线性数据结构将问题抽象化
  • 擅长计算时空复杂度,保障公司资源的最大利用率

简单算法面经

  • 在无序数据结构中,快速寻找中位数

简单的快排,找中间,复杂度是O(nlogn)
快排的优化空间,取中间,将少的另一部分舍弃,继续在大的区间取中间,记得把前面的舍弃的位数记上,,如果运气好,左右相等,则选的基点就是中位数,,,快排的灵活运用啊….

  • 为什么快排比冒泡更快?

冒泡的空间复杂度是O(n^2),应为他有两层for循环,
快排,选择基点,两边分别递归排序,空间复杂度是O(nlogn)明显nlogn < n^2

  • [ ] 给出10万条人和人之间的朋友圈,求出这些人之间有多少个朋友圈

  • [ ] 一串很长的二进制字符串,求出它除以3的余数.

  • [ ] 在一个需要频繁更新的业务场景中,求出区间和(mmp,首先区间和是什么意思)

  • [ ] 在一个原本应该成对出现的数组中,寻找唯一一个不成对的数

个人体会

花了一个星期解决了一个路径算法问题.
又花了一个月,看完+写完几个经典排序算法,感觉收获很大啊
看到很多动画动态效果,突然蹦出很多解决思路…..比如轮播图要用双向链表去解决之类的….

逛了一个小时知乎

一首凉凉送给自己….
不懂算法和数据结构还能算是程序员么…..

冒泡排序

  1. const pop = async (arr, ms, func) => {
  2. let time = 0;
  3. console.log('冒泡排序:比较相邻两个元素大小,如果第一个比第二个大,则交换他们.');
  4. for (let i = 0; i < arr.length; i++) {
  5. for (let j = 0; j < arr.length - 1; j++) {
  6. if (arr[j] > arr[j + 1]) {
  7. console.log(`交换: ${j}-${j+1}, ${++time}次.`)
  8. arr = func(j, j + 1);
  9. } else {
  10. console.log(`不用交换: ${j} - ${j+1}, ${++time}次.`)
  11. }
  12. await dely(ms)
  13. }
  14. }
  15. return `冒泡排序完成,一共花了${time}次,O(n^2)复杂度`;
  16. }

归并

  1. const mergeSort = (left, right) => {
  2. if (left === undefined) return;
  3. var result = [];
  4. var il = 0;
  5. var ir = 0;
  6. while (il < left.length && ir < right.length) {
  7. if (left[il] < right[ir]) {
  8. result.push(left[il++])
  9. } else {
  10. result.push(right[ir++])
  11. }
  12. }
  13. while (il < left.length) {
  14. result.push(left[il++])
  15. }
  16. while (ir < right.length) {
  17. result.push(right[ir++])
  18. }
  19. return result
  20. }
  21. const merge = (arr) => {
  22. // 第一个实际可用的排序算法,复杂度:O(nlog^n).
  23. // 对于 Array.prototype.sort
  24. // Mozila Firfox 采用 归并排序,而chrome采用的快排.
  25. // 归并排序是一种分而治之的算法
  26. // 将原本分散的数组归并成较大的数组,直到最后只有一个排序完毕的大数组
  27. // 第一步,将数组分散,成一个个最小单位
  28. // 只有一个数就是终点
  29. const len = arr.length;
  30. if (len === 1) return arr;
  31. const mid = Math.floor(len / 2);
  32. const left = arr.slice(0, mid);
  33. const right = arr.slice(mid, len);
  34. // 排序发生在归并过程中
  35. // 由merge函数承担这项任务
  36. return mergeSort(merge(left), merge(right))
  37. }

快排算法

  1. var quickSort = function (arr) {  
  2. if (arr.length <= 1) return arr;  
  3. var pivotIndex = Math.floor(arr.length / 2);  
  4. var pivot = arr.splice(pivotIndex, 1)[0];  
  5. var left = [];  
  6. var right = [];  
  7. for (var i = 0; i < arr.length; i++) {    
  8. if (arr[i] < pivot) {      
  9. left.push(arr[i]);    
  10. } else {      
  11. right.push(arr[i]);
  12. }
  13. }  
  14. return [
  15. ...quickSort(left),
  16. pivot,
  17. ...quickSort(right)
  18. ]
  19. };

usage/用法

已经put到npm上面了

  1. yarn add @pengliheng/algorithms
  2. import {
  3. quickSort, // 快排算法
  4. merge, // 快排算法
  5. pop, // 冒泡算法算法
  6. divided
  7. } from '@pengliheng/algorithms/lib/sort.js';
  8. import {
  9. stack, // 栈 , 和 Array没毛区别
  10. queue, // 队列
  11. link, // 单项链表
  12. dbLinkList,// 双向链表
  13. CricleDoubleLinkList, // 循环双向链表,准备用来做轮播图
  14. } from '@pengliheng/algorithms/lib/structures';
  15. var newArr = quickSort(arr);
  16. console.log(newArr);
  17. const criDbLinkList = new CricleDoubleLinkList();
  18. criDbLinkList.append(222);
  19. criDbLinkList.append(123);
  20. criDbLinkList.append('是否');
  21. criDbLinkList.append('不是');

发布

  1. npm publish --access=public