2023.7.9 CS课程 扫二维码继续学习 二维码时效为半小时

(0评价)
价格: 99999.00元

现在大体框架,子函数可以先用名字代替,最后再写

 

sort:

  • 冒泡,选择,插入 O( n^2)
  • 归并,快速,堆 O(nlogn)
  • 桶,基数,计数,O(n)

 

 

  • 冒泡排序

比较相邻的元素,然后交换,大的后移,对所有的元素移动排序,两个for

优化,如果发现某个元素不用移动,可以提前退出内部for循环,说明已经对他来说已经排完了。但注意 23401这种情况看看

 

  • 选择排序

找最小,放在起始位置,然后后面的在找最小,然后跟第二位置交换,以此类推

 

  • 插入排序

两个序列,扫描未排序序列,然后往前比较,然后插入到对应的有序序列的对应位置,知道所有未排序序列都被扫描

 

  • 希尔排序

不稳定排序,优先比较距离远的元素,然后逐渐缩小增量比较,对于插入排序改进,选择增量序列k,按照k的个数进行k躺排序,每趟排序,根据对应增量,分割成子序列然后分别插入排入。

 

 

Divide and conquar

  • merge sort

把已经排好序的子序列合并。n->n/2和n/2->各自分成两个, 然后分到最小序列,然后一点点合并成最上面,可以用递归算法,但内存消耗比较大,也可以用迭代。分成sort函数和merge函数,在merge时,两个array长度不一定相同,可以用双指针 merge sorted lit,判断一个赋值一个,最后某一个走完之后另一个直接复制到sorted后面

 

  • quick sort

挑出基准量,然后根据这个标准分成左右两边,小在左,大在右,然后不断细分下去,pivot的选择也很重要

 

  • heap sort

类似于二叉树,先创建一个heap,把队首和队尾呼唤,大顶堆和小顶堆,father和child的比较。把heap的尺寸缩小1,然后剩余的元素重新构建大顶堆,然后重复步骤,知道heap的尺寸缩小为1。

 

  • 桶排序 bucket sort

设定一个定量的数组当作空桶,遍历输入数据,并把数据一个一个对应放到桶里,对每个不是空的桶排序,然后从不是空的桶把排好序的数据连接起来。

桶就是一个范围桶,内部进行sort可以merget sort或者其他的也行。  

桶的数量的选择, (max-min)/length+1;

 

  • radix sort 基数排序

适合小范围数

首先取得最大值,并取得位数,然后从最低位开始排序,然后根据10号位拍,然后地推,从最小位开始可以保持每个位数内部的大小关系保持:14》13》12这种在10号位=1的内部,这样就能保持一个稳定的。其实内部的实现也是桶排序,bucket

 

  • 计数排序counting sort

找出max和min,然后统计每一个值为i的元素统计次数,然后存入数组C的第i项。 累加所有的次数(从C中第一个元素开始),反向填充目标数组:将每个元素i放在新数组的第c【i】项,每放一个元素就c[i]-1,类似与从桶中一个一个拿出来连着排放位置。

 

 

heapsort 可以用来找kth 最大或者最小

kth 最值可以quick sort的pivot思路,递归,

one-pass algorithm:只读一次input

sort_color : 4 color, 初始化4个常量。然后发现0,则所有的count+1,因为底部升高,上面全都升高,后面以此类推就可以求次数

H_index?

 

wiggle sort: 找中位数,分成前后两个等长部分,然后穿插安放

Maximum gap: bucket控制至少一个空bucket,这样,bucket内部最大gap=一个bucket长度,但是bucket之间gap却可以》=一个bucket之间

 

[展开全文]
shaning · 10-25 · 0
  • array  :可以index赋值

arraylist: 两个都可以表示list。  像是class的样子,只能add加法。

array 和 arraylist接口不一杨

interface和 右边的 object:

eg; List<String> al=new ArrayList<String>

List<String> al2=new LinkedList<String>

举例:

List<String> al=new ArrayList<String>

 al=new LinkedList<String>重新赋值也可以,都是list。

但是

ArrayList<String> al=new ArrayList<String>

 al=new LinkedList<String>就会报错。

所以说左边最好写成List泛用性大点,一种coding习惯。

 

 

可以看tutorial去学习arraylist的具体操作,add change remove 等等和new一个arraylist

 

 

 

 

 

  • Hashmap:  <key,value>,key格式不定

array is a special type of Hashmap:<position, value>

暴力搜索O(e^n),排列组合是n!

eg. a=[2,4,56,7,7,8,7] 

Hashmap:知道key求value:O(1),想知道value-》index,可以create一个hashmap。

hashmap的用法可以网上:new, hashmap.keyset

eg: for (integer key : amap.keyset){} for的一个用法

    for( entry <integer,String> entry: a.entryset){}  每一个entry是《key,value》,重新创造类也可以

 

 

API是什么????get,post,put,delete

用法举例:a.putIfAbsent(key,value),就是如果不存在这个key,就push,也可以用if(a.containKey(key1)) {a.put(key1,value)}。省时用法

hashmap原理:视频 how hashmap works in Java:  www.youtube.com/watch?v=c3RVW#KGIIE  48.52秒。 面试可能会问

 

其实hashmap不是严格O(1),比如和inputsize有关,如果input string很长为n,那就是O(n),如果input长度是一个list,长度n,内部元素长度1,那hashmap长度也是O(1).

以回答时间复杂度是考虑input size

eg. 10万个数,2万个和key1有关(linklist),所以复杂度也算是O(n)。算是实际实现问题

如果用2茶树,O(log(n)),java 8的优化。

 

 

 

  • Two sum面试题

leetcode 刷题,算法面试流程:

1.可以一边问面试官requirement,理解题目意思,

2. walk through examples ,复杂度之类的。

3.还可以问面试官自己的大致思路make sense么

4. 得到认可的话就可以开始coding。

5.还剩余时间的话:

            a.面试官可能会问follow question。(一般不需要codng,给思路就可以)

            b.可能还存在一些bug或者特殊情况没考虑,面试馆可能让你过一遍代码根据example,来debug。但也不一定有bug。

但2,3步可能会占挺多的时间,不要很担心,因为没思路不行

 

思路:

search的方法:sorted list的话可以二分法,o(log(n))   , hashmap: O(1)。

walk through example,自己改一下限制条件然后看看思路怎么样

语法问题忘记了的话可以新开个窗口搜一下或者问一下能不能搜一下用法

2 pointers正方向反方向走O(n^2)

 比如sorted array(小->大),如果add后大于target那么右指针往左走,因为要缩小求和就一个for(i, j=len-i-1;i<j;)就可以了。

for可以两个变量,也可以把一个变量写到外面,因为要考虑左右指针的移动,多以i++,j--可以for内部if判断

也可以用while(i<size && j>=0) if 求和小于target,左pointer右走,大于右pointer左走。等于return

但是不是sorted的话要先做sorted在写思路,一般情况下sort函数O(nlogn)

需知道solution的时间和空间复杂度;  

如果面试官提醒有O(n)那么就不要sort了

看看hashmap

    如果知道元素i和target,那么可以看看能不能找到另外一个差值数在不在里面,看看在哪里,所以要用hashmap(这是思路逻辑而不是知道答案上来就说hashmap

eg.HashMap<Integer, Integer> map=new Hashmap< >(); (可以省略,因为前面写了)

for建立hashmap O(n)

if map.containKey(target-num[i])存在就return,不存在就下一个num[i]   O(N)

空间是O(n),因为有hashmap。牺牲空间换了时间

 

窍门:如果没时间写某个functoin比如binary search,可以写comment和跟面试官说一下,然后不细写

 

  • three sum

固定一个数,然后利用two sum

 

 

作业相似题:

 

 

[展开全文]
shaning · 10-24 · 0
  • Linked list

node{ int val; Node next;}

1->2->5>7>null

可以每次都先设一个dummyhead,return dummy head.next

二叉树: node{ int val; Node left;Node right}

 

Database Index,讲到树的时候会有提

三大基本功:

  1. reverse a link list
  2. merge sorted link list
  3. find the middle node of the linklist

dumy node可以放在开头

  • reverse就是next变成prev,原来的head指向null,原来的尾变head
  • middle 的话,一个for loop就可以找到,按照双指针来,尾部走两个,middle走一个
  • merge two sorted list, 双指针,判大小,然后东一。可以先设一个prehead->a->b,return a就可以。注意判断条件:L1很短,空了之后直接把L2后面接上就好了

 判断link list是不是环(不太会考)

double link list

  • 回文判断,双指针,但注意要回预处理大小写字母,空格字符的处理

 

  • soretd array去重,只能in-place和不能创造新的空间,思路:双指针,尾指针判大小后往后移动最后一个同位素的后面,头指针不动,然后把头指针的next赋值成新的数字,移动head,重复尾指针移动,然后return这个去重list。
     

 

  • 滑动窗口,有一个size的subarray,让他内部元素sum最大,小窍门[a,b,c,d]和[b,c,d,e],sub2只需要sub1-a+e就行

 

  • 3sum=0,但不只一组sum相同的情况,全部return。 先sort,然后如果已经sum>0,那么肯定直接break就行,再往后更大,优化: low increment到不重复的新数,eg,0,0,1, 这里lo跳过后面的0直接到1

 

  • 3 sum closest.   常量:INT_MAX和INT_MIN,看32bit还是64bit,

算法除了写出思路,还要讲出思路(80),还要optimization

[展开全文]
shaning · 10-24 · 0

大公司更偏向算法和基础知识掌握,比如刷题更针对大公司。 算法和数据结构。 bar:focus 在解题能力,没有system-design要求对刚毕业的人。45分钟解答出一到两道1-2难度的题、有可能有hard。 

大公司即便对计算机没有极大的要求也可以通过面试进去。

小公司要求项目能力,额外学一些java在工业界,安卓等上面的应用。

 

Sublime text, VS code build java。IDE有联想功能可能更方便

  • Java 面对对象的编程语言,类似python

分为:object, method, class

 

import java.utils.*;

import java.io.*;

pubilc class Helloworld {

      public  main( String[] args ) {

System.out.print.....

     }

}

 

 

 

  1. object

String s;    s=new String();   合并成一:String s=new String("Hello")

例子: String s2=s 指向同一个object

s2=new String(s);  这两个不一样的object,东西一样。

s2=s.toUppercase();  String s3= s2.concat("!!"); ===s3=s2+"!!"  s3和s2不一样的object。s2创造了新的指针,没有改变原来的string。 但这个只是对string成立的,即要想改变string object,只需要create 一个新的 string就行,

  • Class

class human{

    pubilc int age;

    pubilc void introduce()  {  print}  这是method

    oublic void copy( Human ori){         

                         age=orig.age}

}

Human amada= new Human();创造一个object

amanda.age=6;  赋值

amade.introduce() ;call method

Human mike= new Human() ; 新的object

mike.copy(amand); 这里mike的变量和amaenda一样

 

  • constructors

可以自己定义,也有默认,因为上面就是没有外部赋值给一个内部元素,防止崩溃:

     public human(int x, string name){

  age=x; y=name  }

但是注意:Human amada= new Human();这样会报错,和定义的constructor不一样

  • this, 充当的指针

class human{

    pubilc int age;

   pubilc human(int givenage){  this.age=givenage, this.name='skkkk'}                                       this是optional

   pubilc void chaneg(int age,){

    this.age=age}这里this不能省略因为要不然没用age=age

}

  • static

可以在不同的objects里面share同样的值

eg.   class human{

       pubilc static num;

      public  human(){

        num++}这样可以用的统计object数量,因为每个object都有同样的值

       pubilc static void printhume(){

        num} static method不能pass object,因为这可能导致不同的object的static变量然后出错

}

  • variable的lifetime

local: method里面就是method运行完就消失。

instance :非静态:就是只要amanda这个object还在,他就在

static:只要program在运行就一直在,所以不同的object可以share

  • primitive type variable

不是reference to object,例如 int, long, float, 怎么创建: “6”,“3.4”, “true”

object create: new 

object define: class definition

            initialize: constructor

            use: method

例如 string 是一个object,可以 String name="hello";   name ="world"指向了另一个object。

这是java 内置的, 一般string不用写 String name= new String{"hellp"}

  •          java library

Math class.

Integer class.//convert a string to an integer.   注意 Integer.conv("3.14")会报错

  • boolean

&&, ! , 等等操作

x= 3==5 可以直接判断赋值

boolean pass =score <60

if (pass){} else{}

也可以if (score >=60){}更简洁

简介的表达形式:a= x>y ? max(x,z) : max(y,z)

  • Switch-case

switch (month){  

case 2:

      a=2;  break;

case 4:

case 6:

default: days=2;  break;

}

  • do loop

 do {}  while()起码会run一次,while有可能一次不run

  • for

for (initialize; condition; next) {},next 可以省略

  • array

fixed number , z在create的时候就确定了

char[] c;  // reference to an array

c=new char[4];  //construct and array

c[1]='b';//赋值

小窍门: 判断n的平方根和d比较: d*d <=n因为开平方比较耗资源

  • multi-dimensional array

two dimensional array is an array of references to arrays. 第一层里面存的是内部array的指针

int[][] pt= new [n][]    这样的话内部矩阵可以不同长度  例如帕斯卡三角, 当然内部长度也可以直接定义

for (int i=0; i<n; i++){

                 pt[i]=new int[i+1]   // 内部 

}

更多array declarations: 

human[] b={a, mike, new human("me")}

int[][] c= {{7,4,3},{3,3,x},{x+y}}

d= new int[] {3,7}

     下面这些都是declaration:没有construct

int[] a,c,b ;/// a,b,c all reference array,不是object

int a[], b,c[][] /// a is 1D,b is not a reference/array

int[]  a,b[]/// a is a reference to a 1 D array, b reference a 2D array 很逆天

 

[展开全文]
shaning · 10-20 · 0

C++不适合入门,不适合写web,

C,C++和C#有区别

C#和C++面向对象,

1.java主要是web,可以说设备平板程序,不适合卓面程序。

2。编辑-》编译-》调试-》发布。   调试:加法写成减法,编译通过,test没过

 

3。编程学习途径:纵向:语言:python等-》类库:math等-》框架:eg:网络开发的逻辑,组合类库的最佳方案。

                      横向:命令行程序,桌面程序,平板程序,web服务,游戏 

 

4.C#开发环境:Visual studio 所见即所得,应用程序开发    VS2013 express for windows desktop.

5.学习资料:MSDN文档,全面。VSzhong Help content,  eg.C# programing guide

                   C#语言定义文档:精确定义,难读懂,跳跃性大。  C# language specification

                   推荐书籍:C# 5.0 in a Nutshell

 

[展开全文]
shaning · 10-19 · 0

一些implement 神经网络的代码

dense:fully connected layed

 

input layer:

NN: fully connected, hyperparameter,神经元数量,需要自己tune,数据量少,HP可以稍微少点,避免overfit。根据train performance和test performance 来tune 超参数:learning curve。 中间几层layer也算是超参数

output: 和prediction size一样,softmax函数,

compile network: 选择optimization方法:Adam和rmsprop,确定loss function, 选择metrica,训练的时候会print accuracy。

 

train——image的pre_processing:reshape,pixel value从0到1(input normalization)。

把label定义,one-hot encoding,从一味矩阵变成10*10

开始train网络,epoch=5轮,每组6万张图片,(每张图片训练5次)总共数据量30万次。batchsize:6万丈中每次选择128张一块训练求出y值,然后加起来128个之后总共backward propagation。

[展开全文]
shaning · 10-16 · 0

深度学习数据量越大,表新越好,传统机器学习会饱和。

AI可以计算机视觉,speech识别和生成:siri,语言理解:聊天机器人等等,广告,机器人。

为什么deep learning流行现在:新train 方法,大量的高质量标注数据集:imagenet,软件平台:google的tensorflow等等,pytorch等等, GPU的大量平行计算加快训练时间。

推荐课程:cs231n.stanford/edu.  2017年youtube视频,可以选择去看,然后可以对computer vision有深刻理解。

CNN大部分用于图像识别,recurrent NN适用于时序信息识别:音乐,文本,讲话,生成C++代码。强化学习:阿尔法狗。 GAN用于虚假图片的生成,模仿声音/照片,换脸技术。

 

[展开全文]
shaning · 10-16 · 0