首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >《algorithm-note》算法笔记中文版正式发布!

《algorithm-note》算法笔记中文版正式发布!

作者头像
红色石头
发布于 2022-01-20 12:53:01
发布于 2022-01-20 12:53:01
22100
代码可运行
举报
运行总次数:0
代码可运行

无论是做机器学习深度学习自然语言处理还是其它领域,算法的重要性不言而喻!吃透算法底层原理、掌握算法数学推导和代码实现,对提高自己的硬核实力来说非常重要!今天给大家推荐一个超赞的开源算法笔记!中文版!而且在 GitHub 上已经收获了近 1k 的赞了!

首先放上该笔记的 GitHub 地址:

https://github.com/Dairongpeng/algorithm-note

简介

该开源项目主要内容包括:数组,链表,树,图,递归,DP,有序表等相关数据结构与算法的讲解及代码实现。作者是“左神”,通过算法课笔记记录,整理一份尽可能还原网课的笔记,还包括代码的实现,可方便读者当成工具书便于查询。

目录

该项目总共包含 24 节内容,每一节内容都配备了笔记和代码实现。

同时,作者提供了 GitHub Page 阅读页面,提高了友好交互性:

https://dairongpeng.github.io/algorithm-note/

例如,我们来看第 1 节的内容。

第 1 节介绍的是时间复杂度、空间复杂度、排序、异或运算。主要包括:时间复杂度、空间复杂度、常数项时间复杂度、算法最优解、常见时间复杂度、算法和数据结构脉络 、认识对数器、认识二分法 、认识异或运算。

作者对每个知识点都有简明扼要的概括和总结。

除此之外,像排序算法还有相应的示例代码,例如我们最常见的冒泡排序:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package cass01;


import java.util.Arrays;


public class Code02_BubbleSort {


  public static void bubbleSort(int[] arr) {
    if (arr == null || arr.length < 2) {
      return;
    }
    // 0 ~ N-1
    // 0 ~ N-2
    // 0 ~ N-3
    for (int e = arr.length - 1; e > 0; e--) { // 0 ~ e
      for (int i = 0; i < e; i++) {
        if (arr[i] > arr[i + 1]) {
          swap(arr, i, i + 1);
        }
      }
    }
  }


  // 交换arr的i和j位置上的值
  public static void swap(int[] arr, int i, int j) {
    arr[i] = arr[i] ^ arr[j];
    arr[j] = arr[i] ^ arr[j];
    arr[i] = arr[i] ^ arr[j];
  }


  // for test
  public static void comparator(int[] arr) {
    Arrays.sort(arr);
  }


  // for test
  public static int[] generateRandomArray(int maxSize, int maxValue) {
    int[] arr = new int[(int) ((maxSize + 1) * Math.random())];
    for (int i = 0; i < arr.length; i++) {
      arr[i] = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random());
    }
    return arr;
  }


  // for test
  public static int[] copyArray(int[] arr) {
    if (arr == null) {
      return null;
    }
    int[] res = new int[arr.length];
    for (int i = 0; i < arr.length; i++) {
      res[i] = arr[i];
    }
    return res;
  }


  // for test
  public static boolean isEqual(int[] arr1, int[] arr2) {
    if ((arr1 == null && arr2 != null) || (arr1 != null && arr2 == null)) {
      return false;
    }
    if (arr1 == null && arr2 == null) {
      return true;
    }
    if (arr1.length != arr2.length) {
      return false;
    }
    for (int i = 0; i < arr1.length; i++) {
      if (arr1[i] != arr2[i]) {
        return false;
      }
    }
    return true;
  }


  // for test
  public static void printArray(int[] arr) {
    if (arr == null) {
      return;
    }
    for (int i = 0; i < arr.length; i++) {
      System.out.print(arr[i] + " ");
    }
    System.out.println();
  }


  // for test
  public static void main(String[] args) {    
    int testTime = 500000;
    int maxSize = 100;
    int maxValue = 100;
    boolean succeed = true;
    for (int i = 0; i < testTime; i++) {
      int[] arr1 = generateRandomArray(maxSize, maxValue);
      int[] arr2 = copyArray(arr1);
      bubbleSort(arr1);
      comparator(arr2);
      if (!isEqual(arr1, arr2)) {
        succeed = false;
        break;
      }
    }
    System.out.println(succeed ? "Nice!" : "Fucking fucked!");


    int[] arr = generateRandomArray(maxSize, maxValue);
    printArray(arr);
    bubbleSort(arr);
    printArray(arr);
  }


}

整体的阅读体验很不错!

希望这份《algorithm-note》算法笔记中文版对你有所帮助!最后,再放上该开源项目的 GitHub 地址:

https://github.com/Dairongpeng/algorithm-note

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/05/08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
八大排序算法的Java实现(上)
快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短
JavaEdge
2021/02/23
2890
八大排序算法的Java实现(上)
八大排序的Java实现概述1. 插入排序—直接插入排序(Straight Insertion Sort)2. 插入排序—希尔排序(Shell`s Sort)4. 选择排序—堆排序(Heap Sort)
概述 排序有内部排序和外部排序 内部排序是数据记录在内存中进行排序 外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存 时间复杂度为最差情况下的复杂度 八大排序就是内部排
JavaEdge
2018/05/16
1.6K0
小和问题1 最直接方法2 归并方法
小和问题 在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。求一个数组 的小和。 例子: [1,3,4,2,5] 1左边比1小的数,没有; 3左边比3小的数,1; 4左边比4小的数,1、3; 2左边比2小的数,1; 5左边比5小的数,1、3、4、2; 所以小和为1+1+3+1+1+3+4+2=16 1 最直接方法 依次遍历各元素左边 时间复杂度O(N) 2 归并方法 每次merge得出一个小和 package com.sss; /** * @author Shu
JavaEdge
2018/05/16
6910
干货 | 手撕十大经典排序算法
当然,学算法是件相对枯燥的事情,不过,当你懂得算法这种思路之后,你会发现,算法真的是一个很神奇的东西,而且,算法引出的思想非常重要!!所以,千羽也会不断的学习死磕算法系列文章,和大家一起学习,一起进步。这篇文章主要讲解十大经典排序算法。话不多说,冲冲冲!
千羽
2021/12/29
5250
干货 | 手撕十大经典排序算法
八大排序算法的Java实现(下)
2)通过一趟排序讲待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小。另一部分记录的 元素值比基准值大。
JavaEdge
2021/02/23
6600
八大排序算法的Java实现(下)
三分钟彻底理解冒泡排序
    (1)第一次比较:首先比较第一和第二个数,将小数放在前面,将大数放在后面。
全栈程序员站长
2022/09/06
2060
三分钟彻底理解冒泡排序
对数器应用-SelectionSort-选择排序
import java.util.Arrays; public class SelectionSort { public static void selectionSort(int[] arr) { if (arr == null && arr.length < 2) { return; } for (int i = 0; i < arr.length - 1; i++) { // 当前位置标记为最小值 int minIndex = i; for (int j =
sr
2018/08/20
3560
BucketSort-桶排序-计数排序
import java.util.Arrays; public class BucketSort { //桶排序-计数排序 public static void bucketSort(int[] arr){ if(arr==null||arr.length<2) { return ; } int max=Integer.MIN_VALUE; for(int i=0;i<arr.length;i++) { max=Math.max(max, arr[i]); } i
sr
2018/08/20
2920
SmallSum-归并排序-小和问题(逆序对)
例如:数组[4,2,5,1,7,3,6] 第一个元素4比2大,不算小和,5比4和2都大,那就是4+2=6;1比4和2和5都小,不算小和;7比前面的都大,那就是上次小和6+4+2+5+1=18;然后3前面比2和1大,那就是18+2+1=21;最后6比4、2、5、1、3都大,结果就是21+4+2+5+1+3=36。那么最后的结果就是36。
sr
2018/08/20
5590
用一个测试类简化排序算法时间复杂度的研究
在学习算法的过程中,除了熟练掌握各种算法的程序逻辑外,还经常需要用到一些测试案例对算法的时间复杂度做具体的测试。本文将通过打造一个测试类工具包,让我们可以更简便地研究排序算法的时间复杂度。
智慧zhuhuix
2020/08/14
5430
用一个测试类简化排序算法时间复杂度的研究
MaximumGap-桶排序-最大间隔问题
题意:给定一个未排序的数组,返回其排序后的数组中 相邻元素之差 最大的值。 比如给定:[5,9,8,3,15] 排序后为:[3,5,8,9,15],相邻元素之差最大的是15-9=6,返回6。 复杂度要求:时间空间均为O(n)。 import java.util.Arrays; public class MaximumGap { // 桶排序-相邻最大值 public static int maximumGap(int[] arr) { if (arr == null || arr.length
sr
2018/08/20
4120
算法学习(一)——插入排序
插入排序 一步一步思考,拆分,由浅入深: 先找出最小值,小循环没啥大问题再进入下一步,再去思考边界问题。 int minPos = 0; // 一步一步思考,先获取最小值 for (int i = 0
传说之下的花儿
2023/04/16
1630
算法学习(一)——插入排序
Java基础-数组
前两篇介绍了Java的数据类型和流程控制,现在来讲一下Java的数组,作为一种引用类型,也是非常常见和常用的。这次的知识框架如下所示。
reload
2024/01/16
2850
Java基础-数组
牛课堂算法直播题目
一、介绍 直播人:左程云老师 直播时间:2018.2.1晚上八点 二、code技巧的磨炼 【题目】荷兰国旗问题 已知一个整型数组arr,和一个整数num,请把小于num的数放在数组的左边,等于num的数放在数组的中间,大于num的数放在数组的右边。 要求:时间复杂度为O(N),额外空间复杂度O(1)。 理解:设置 l 为左边界,r 为右边界,less 为小于区域右边界,more 为大于区域左边界。将小于等于num的数都放于数组的左边,当 i 与 l 的值相等时,遍历结束。 package tmp; pub
Zoctopus
2018/06/04
9320
十大经典排序算法最强总结(含Java、Python码实现)
所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。排序算法,就是如何使得记录按照要求排列的方法。排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面。一个优秀的算法可以节省大量的资源。在各个领域中考虑到数据的各种限制和规范,要得到一个符合实际的优秀算法,得经过大量的推理和分析。
10JQKA
2020/12/31
1.1K0
①归并排序、快速排序 、堆排序、计数排序[算法、代码模板、面试题]
个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~
.29.
2023/12/06
4960
①归并排序、快速排序 、堆排序、计数排序[算法、代码模板、面试题]
十种排序算法总结(冒泡、插入、选择、希尔、归并、堆、快速,计数,桶,基数)
该文章介绍了如何利用C++实现一个简单的HTTP服务器,包括处理客户端请求、解析请求体、返回响应以及关闭连接。主要使用了C++的流和字符串处理功能,以及基本的HTTP协议知识。
s1mba
2017/12/22
1.1K0
十种排序算法总结(冒泡、插入、选择、希尔、归并、堆、快速,计数,桶,基数)
归并排序 O(nLogn)
归并排序的思想是分治法+回溯,将一个无序的数组先按照原来的一半进行拆分,一直拆分到最后一个元素,然后开始回溯,排序开始的过程是再回溯时开始排序的。
g小志
2020/07/21
4260
美团一面:两个有序的数组,如何高效合并成一个有序数组?
归并算法采取思想是分治思想,分治思想简单说就是分而治之,将一个大问题分解为小问题,将小问题解答后合并为大问题的答案。
Java技术栈
2021/10/19
2.1K0
主流排序算法全面解析
是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端--维基百科。
用户2038589
2019/08/07
5620
主流排序算法全面解析
推荐阅读
相关推荐
八大排序算法的Java实现(上)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档