本 Wiki 开启了 HTTPS。但由于同 IP 的 Blog 也开启了 HTTPS,因此本站必须要支持 SNI 的浏览器才能浏览。为了兼容一部分浏览器,本站保留了 HTTP 作为兼容。如果您的浏览器支持 SNI,请尽量通过 HTTPS 访问本站,谢谢!
这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录前一修订版后一修订版 | 前一修订版 | ||
cs:dsa:courses:gtx_1332x:i_lists:start [2024/02/12 07:37] – [数组与循环机制] codinghare | cs:dsa:courses:gtx_1332x:i_lists:start [2024/02/12 11:30] (当前版本) – [Java 的 modulo 操作] codinghare | ||
---|---|---|---|
行 692: | 行 692: | ||
* '' | * '' | ||
* '' | * '' | ||
- | * '' | + | * '' |
* '' | * '' | ||
* '' | * '' | ||
行 727: | 行 727: | ||
==enqueue== | ==enqueue== | ||
+ | ===Priority queues=== | ||
+ | //Priority queues// 是另外一种线性的 ADT。其特点是,当前移除的对象是**优先级最高的对象** 。这种 ADT 通常用于搜寻最大最小值。 由于有大小的存在,Priority queues 中的对象必须是 Comparable 的。 | ||
+ | ==功能与效率性== | ||
+ | Priority queues 会分为两个区:一个 Priority 区和一个备选区。Priority 区中存放优先级最高的数据用于操作。当 Priority 区中的数据移除后,备选区需要通过另一轮筛选选出下一个优先级最高的数据推送到 Priority 区中,以便接下来的操作。 | ||
+ | \\ \\ | ||
+ | 可以注意到,每处理一轮 Priority 区中的数据,备选区中的数据就需要排序一次,为了更好的效率,具体实现是基于 heap 的。 | ||
+ | <WRAP center round box 100%> | ||
+ | Priority queues 是线性类型的 ADT,但使用线性数据结构实现确十分低效。不论使用数组还是链表,我们都需要Priority queue 是一个有序数列。这意味着,每次 enqueue 需要进行一次排序(链表需要遍历到插入新元素的位置),也就是每次 enqueue 的复杂度都在 $O(n)$。这样是非常不效率的。 | ||
+ | </ | ||
+ | ===Deques=== | ||
+ | // | ||
+ | ==Deque 的方法== | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | ===Deque 的实现(数组)=== | ||
+ | //Deque// 的数组实现同样需要使用到循环的方式。 | ||
+ | ==addLast() & removeFirst()== | ||
+ | * addLast() 通过 '' | ||
+ | * removeFirst() 通过 '' | ||
+ | ==addFirst() & removeLast()== | ||
+ | 这两个方法也需要通过循环的方式进行位置的维护。但由于其进出方向与之前的两个方法完全相反,如果使用同样的 '' | ||
+ | <code java> | ||
+ | //this applied to back as well | ||
+ | if (front < 0) { | ||
+ | front = capacity - front; | ||
+ | } | ||
+ | </ | ||
+ | <WRAP center round box 100%> | ||
+ | 所有的操作(除开 resize)都是 $O(1)$,总的说来是 $O(1)^*$ | ||
+ | </ | ||
+ | ==Java 的 modulo 操作== | ||
+ | 通常情况下,末除是一个分类的过程。所有余数相同的数字都会被放入到一个类中。在这个类中,**最小的**,**非负的成员**会成为余数。这导致了负数做末除时存在着不同。比如 $9 % 5 = 4$;但进行 $-9 % 5$ 时,因为要保证余数非负,取余的方向实际上需要更往负数方向上进行。比如这里,如果之间按正数的取余方式 $-9$ 去除 $(-1)\times5$ 还有 $-4$,但由于需要余数为正,因此需要再去除一个 $(-1)\times5$。因此余数是 $1$。\\ \\ | ||
+ | 但在 Java 中,余数的结果并不要求为正,而是**最接近 0 的数**。这种情况是我们之前讨论的第一种情况:'' | ||
+ | ===Deque 的实现(链表)=== | ||
+ | //Deque// 的实现需要使用**双链表**(DLL): | ||
+ | * //add first// & //remove first// 均在 head 处操作 | ||
+ | * //add fisrt// & //remove last// 均在 tail 处操作 | ||
+ | 由于使用双链表,所有的操作都是 ($O(1)$) | ||