学习数据结构的第九天(一)(包括一些学习的指引)

学习的指引:关于怎么去看说明文档,即:有哪些接口的函数来使用等。  

对于堆这种东西,目前认为是:自己写实现的一种东西。

而对于priorityQueue可以用堆实现,应该是有相应的已经写好的,调用即可的接口

 

对于heap的已经做完了,接下来看priorityQueue,看完之后再去做leetcode的题目

 

对于优先队列的理解:

就是本来队列:先进先出的结果

而对于优先队列:实现了vip的功能,先进的未必先出,具有高优先级的节点先出。

这就是优先队列的引入及作用。

和heap的关系:heap也是可以把最大值和最小值放在根处的,因此heap是可以拿来实现priorityQueue的,作为priorityqueue的底层存储。

 

 

 

先学会了:priorityQueue在java里面,是可以直接使用的,import java.util即可使用了。

然后的话其中的add函数  remove函数 peek函数都略微会用了。

 

对于priorityQueue的比较,学习到挺多:

1.里面的数字,表示的是优先级顺序,默认的话,里面标的是优先级。

例如:8和15,它会认定8是较高优先级的那个。

 

 

2.如果说自己写比较器,定义新的比较逻辑,遵循以下要点:

(1)把比较的内涵给写了,覆写compare函数。

(2)记住,第一个参数表示的是自己,第二个参数表示的是别人。   自己减去别人小于0,那么认为是较优先的。(和compareTo正好相反,compareTo的话,如果说小于0,表示的就是较小)

(3)把比较器放入priorityQueue的构造函数中,将构造的逻辑告诉priorityqueue

 

 

如果说是自定义的类,那么需要告诉它比较的逻辑以及比较的字段,如果想要按照小的是排前面的逻辑,那么应该前面-后面(相应比较字段相减)

如果大的排前面,那么   后面-前面

 

对于static函数的内涵:

static函数不能访问非静态的对象。

原因:每个非static函数,都默认传入了一个this字段在其中。

因为static的函数不能有this对象,所以说不知道访问的是哪个对象。

 

 

 

 

使用方法:先创建当前类对象,再去调用非静态的成员。

例如这里就是用Main创建实例对象

如果此处:不去创建Main的实例对象那直接调用非静态成员,那么是错误的,如下:

 

 先有在这个对象,再去调用这个对象的相应函数。

 

 

 

 

 

 

key:根据函数的内部进去这件事情,对于add(8)这件事情  ,那么this对象意思是x是8,即:x对应的是第一个对象。

即:compare写的是两个数的比较的方法,而实际调用的时候,第一个参数是this,就是拿自己去和新添加的比较。

那么和我想的一样,小于0证明是比较小的。 

写比较器的时候,如果需要小于的数  优先级较高,那么是使用自己减别人。

如果需要大的数优先级比较高,那么用别人减自己。

 

目前就会了如何去调用priorityqueue,如何自己写比较器,如何去做新的类的比较器。

接下来讲一下如何自己使用heap去实现priorityqueue

 

 这是结构:heap的内层实现是array,然后的话priorityqueue的底层结构是heap

对于queue而言,是作为接口,priorityqueue是对于queue的实现。

 

如果是单文件结构:

 

 

 

 

定义的方法都是一样的,只是集成在了一个文件里面而已。

 

对于自己写这个priorityQueue的话,如果是minHeap,那么是小的优先,如果是maxheap,那么是大的优先

原因:与它的存储结构有关,minheap是小的在上面,maxheap是大的在上面。

 

而minheap和maxheap的话,区别在于:  siftUp、siftDwon时候的条件不同,是大于还是小于的时候siftUp终止不一样。

 

 即:minheap和maxheap的区别就在这里而已。几个符号问题。

接下来根据这个写一下leetcode的题目,另起一篇博文。

 

posted @ 2020-04-05 15:43  Start_from_Zero  阅读(132)  评论(0)    收藏  举报