Skip to content

Commit df29ecd

Browse files
author
tianqing.liang
committed
线段树
1 parent b23ad09 commit df29ecd

File tree

10 files changed

+219
-78
lines changed

10 files changed

+219
-78
lines changed

11-Set-And-Map/Main.dart

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ void main() async{
1212
for (String word in result){
1313
bstSet1.add(word);
1414
}
15+
1516
print("Total different words: ${bstSet1.getSize()}");
1617

1718

12-Heap/MaxHeap.dart

+23-23
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,24 @@
33
*/
44
class MaxHeap<E extends Comparable<E>>{
55

6-
List? data ;
6+
List? _data ;
77

88
MaxHeap.withCapacity(int capacity){
9-
data = List.filled(capacity, E, growable: true);
9+
_data = List.filled(capacity, E, growable: true);
1010
}
1111

1212
MaxHeap.withEmpty(){
13-
data = List.empty(growable: true);
13+
_data = List.empty(growable: true);
1414
}
1515

1616
// 返回堆中的元素个数
1717
int? size(){
18-
return data!.length;
18+
return _data!.length;
1919
}
2020

2121
// 返回一个布尔值, 表示堆中是否为空
2222
bool isEmpty(){
23-
return data!.isEmpty;
23+
return _data!.isEmpty;
2424
}
2525

2626
int _parent(int index){
@@ -42,42 +42,42 @@ class MaxHeap<E extends Comparable<E>>{
4242

4343
// 向堆中添加元素
4444
add(E e){
45-
data!.add(e);
46-
siftUp(data!.length - 1);
45+
_data!.add(e);
46+
siftUp(_data!.length - 1);
4747
}
4848

4949
siftUp(int k){
50-
while(k > 0 && data![_parent(k)].compareTo(data![k]) < 0 ){
50+
while(k > 0 && _data![_parent(k)].compareTo(_data![k]) < 0 ){
5151
_swap(k, _parent(k));
5252
k = _parent(k);
5353
}
5454
}
5555

5656
// 看堆中的最大元素
5757
E findMax(){
58-
if(data!.length == 0)
58+
if(_data!.length == 0)
5959
throw new Exception("Can not findMax when heap is empty.");
60-
return data![0];
60+
return _data![0];
6161
}
6262

6363
// 取出堆中最大元素
6464
E extractMax(){
6565
E ret = findMax();
66-
_swap(0, data!.length - 1);
67-
data!.removeLast();
66+
_swap(0, _data!.length - 1);
67+
_data!.removeLast();
6868
_siftDown(0);
6969

7070
return ret;
7171
}
7272

7373
_siftDown(int k){
74-
while(_leftChild(k) < data!.length){
75-
int j = _leftChild(k); // 在此轮循环中,data[k]和data[j]交换位置
76-
if( j + 1 < data!.length &&
77-
data![j+1].compareTo(data![j]) > 0 )
74+
while(_leftChild(k) < _data!.length){
75+
int j = _leftChild(k); // 在此轮循环中,_data[k]和data[j]交换位置
76+
if( j + 1 < _data!.length &&
77+
_data![j+1].compareTo(_data![j]) > 0 )
7878
j ++;
79-
// data[j] 是 leftChild 和 rightChild 中的最大值
80-
if(data![k].compareTo(data![j]) >= 0 )
79+
// _data[j] 是 leftChild 和 rightChild 中的最大值
80+
if(_data![k].compareTo(_data![j]) >= 0 )
8181
break;
8282
_swap(k, j);
8383
k = j;
@@ -88,18 +88,18 @@ class MaxHeap<E extends Comparable<E>>{
8888
E replace(E e){
8989

9090
E ret = findMax();
91-
data![0] =e;;
91+
_data![0] =e;;
9292
_siftDown(0);
9393
return ret;
9494
}
9595

9696
_swap(int i, int j){
97-
if(i < 0 || i >= data!.length || j < 0 || j >= data!.length)
97+
if(i < 0 || i >= _data!.length || j < 0 || j >= _data!.length)
9898
throw new Exception("Index is illegal.");
9999

100-
E t = data![i];
101-
data![i] = data![j];
102-
data![j] = t;
100+
E t = _data![i];
101+
_data![i] = _data![j];
102+
_data![j] = t;
103103
}
104104

105105
}

12-Heap/MinHeap.dart

+22-22
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,24 @@
22
* 最小堆
33
*/
44
class MinHeap<E extends Comparable<E>> {
5-
List? data;
5+
List? _data;
66

77
MinHeap.withCapacity(int capacity) {
8-
data = List.filled(capacity, E, growable: true);
8+
_data = List.filled(capacity, E, growable: true);
99
}
1010

1111
MinHeap.withEmpty() {
12-
data = List.empty(growable: true);
12+
_data = List.empty(growable: true);
1313
}
1414

1515
// 返回堆中的元素个数
1616
int? size() {
17-
return data!.length;
17+
return _data!.length;
1818
}
1919

2020
// 返回一个布尔值, 表示堆中是否为空
2121
bool isEmpty() {
22-
return data!.isEmpty;
22+
return _data!.isEmpty;
2323
}
2424

2525
int _parent(int index) {
@@ -41,42 +41,42 @@ class MinHeap<E extends Comparable<E>> {
4141

4242
// 向堆中添加元素
4343
add(E e) {
44-
data!.add(e);
45-
siftUp(data!.length - 1);
44+
_data!.add(e);
45+
siftUp(_data!.length - 1);
4646
}
4747

4848
siftUp(int k) {
49-
while (k > 0 && data![_parent(k)].compareTo(data![k]) > 0) {
49+
while (k > 0 && _data![_parent(k)].compareTo(_data![k]) > 0) {
5050
_swap(k, _parent(k));
5151
k = _parent(k);
5252
}
5353
}
5454

5555
// 看堆中的最大元素
5656
E findMin() {
57-
if (data!.length == 0)
57+
if (_data!.length == 0)
5858
throw new Exception("Can not findMax when heap is empty.");
59-
return data![0];
59+
return _data![0];
6060
}
6161

6262
// 取出堆中最大元素
6363
E extractMax() {
6464
E ret = findMin();
65-
_swap(0, data!.length - 1);
66-
data!.removeLast();
65+
_swap(0, _data!.length - 1);
66+
_data!.removeLast();
6767
_siftDown(0);
6868

6969
return ret;
7070
}
7171

7272
_siftDown(int k) {
73-
while (_leftChild(k) < data!.length) {
74-
int j = _leftChild(k); // 在此轮循环中,data[k]和data[j]交换位置
75-
if (j + 1 < data!.length && data![j + 1].compareTo(data![j]) < 0) {
73+
while (_leftChild(k) < _data!.length) {
74+
int j = _leftChild(k); // 在此轮循环中,_data[k]和data[j]交换位置
75+
if (j + 1 < _data!.length && _data![j + 1].compareTo(_data![j]) < 0) {
7676
j++;
7777
}
78-
// data[j] 是 leftChild 和 rightChild 中的最大值
79-
if (data![k].compareTo(data![j]) <= 0) {
78+
// _data[j] 是 leftChild 和 rightChild 中的最大值
79+
if (_data![k].compareTo(_data![j]) <= 0) {
8080
break;
8181
}
8282
_swap(k, j);
@@ -87,18 +87,18 @@ class MinHeap<E extends Comparable<E>> {
8787
// 取出堆中的最大元素,并且替换成元素e
8888
E replace(E e) {
8989
E ret = findMin();
90-
data![0] = e;
90+
_data![0] = e;
9191
;
9292
_siftDown(0);
9393
return ret;
9494
}
9595

9696
_swap(int i, int j) {
97-
if (i < 0 || i >= data!.length || j < 0 || j >= data!.length)
97+
if (i < 0 || i >= _data!.length || j < 0 || j >= _data!.length)
9898
throw new Exception("Index is illegal.");
9999

100-
E t = data![i];
101-
data![i] = data![j];
102-
data![j] = t;
100+
E t = _data![i];
101+
_data![i] = _data![j];
102+
_data![j] = t;
103103
}
104104
}

13-Priority-Queue/MaxHeap.dart

+23-23
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,24 @@
33
*/
44
class MaxHeap<E extends Comparable<E>>{
55

6-
List? data ;
6+
List? _data ;
77

88
MaxHeap.withCapacity(int capacity){
9-
data = List.filled(capacity, E, growable: true);
9+
_data = List.filled(capacity, E, growable: true);
1010
}
1111

1212
MaxHeap.withEmpty(){
13-
data = List.empty(growable: true);
13+
_data = List.empty(growable: true);
1414
}
1515

1616
// 返回堆中的元素个数
1717
int? size(){
18-
return data!.length;
18+
return _data!.length;
1919
}
2020

2121
// 返回一个布尔值, 表示堆中是否为空
2222
bool isEmpty(){
23-
return data!.isEmpty;
23+
return _data!.isEmpty;
2424
}
2525

2626
int _parent(int index){
@@ -42,42 +42,42 @@ class MaxHeap<E extends Comparable<E>>{
4242

4343
// 向堆中添加元素
4444
add(E e){
45-
data!.add(e);
46-
siftUp(data!.length - 1);
45+
_data!.add(e);
46+
siftUp(_data!.length - 1);
4747
}
4848

4949
siftUp(int k){
50-
while(k > 0 && data![_parent(k)].compareTo(data![k]) < 0 ){
50+
while(k > 0 && _data![_parent(k)].compareTo(_data![k]) < 0 ){
5151
_swap(k, _parent(k));
5252
k = _parent(k);
5353
}
5454
}
5555

5656
// 看堆中的最大元素
5757
E findMax(){
58-
if(data!.length == 0)
58+
if(_data!.length == 0)
5959
throw new Exception("Can not findMax when heap is empty.");
60-
return data![0];
60+
return _data![0];
6161
}
6262

6363
// 取出堆中最大元素
6464
E extractMax(){
6565
E ret = findMax();
66-
_swap(0, data!.length - 1);
67-
data!.removeLast();
66+
_swap(0, _data!.length - 1);
67+
_data!.removeLast();
6868
_siftDown(0);
6969

7070
return ret;
7171
}
7272

7373
_siftDown(int k){
74-
while(_leftChild(k) < data!.length){
75-
int j = _leftChild(k); // 在此轮循环中,data[k]和data[j]交换位置
76-
if( j + 1 < data!.length &&
77-
data![j+1].compareTo(data![j]) > 0 )
74+
while(_leftChild(k) < _data!.length){
75+
int j = _leftChild(k); // 在此轮循环中,_data[k]和data[j]交换位置
76+
if( j + 1 < _data!.length &&
77+
_data![j+1].compareTo(_data![j]) > 0 )
7878
j ++;
79-
// data[j] 是 leftChild 和 rightChild 中的最大值
80-
if(data![k].compareTo(data![j]) >= 0 )
79+
// _data[j] 是 leftChild 和 rightChild 中的最大值
80+
if(_data![k].compareTo(_data![j]) >= 0 )
8181
break;
8282
_swap(k, j);
8383
k = j;
@@ -88,18 +88,18 @@ class MaxHeap<E extends Comparable<E>>{
8888
E replace(E e){
8989

9090
E ret = findMax();
91-
data![0] =e;;
91+
_data![0] =e;;
9292
_siftDown(0);
9393
return ret;
9494
}
9595

9696
_swap(int i, int j){
97-
if(i < 0 || i >= data!.length || j < 0 || j >= data!.length)
97+
if(i < 0 || i >= _data!.length || j < 0 || j >= _data!.length)
9898
throw new Exception("Index is illegal.");
9999

100-
E t = data![i];
101-
data![i] = data![j];
102-
data![j] = t;
100+
E t = _data![i];
101+
_data![i] = _data![j];
102+
_data![j] = t;
103103
}
104104

105105
}

13-Priority-Queue/PriorityQueue.dart

+7-7
Original file line numberDiff line numberDiff line change
@@ -3,34 +3,34 @@ import 'MaxHeap.dart';
33

44
class PriorityQueue<E extends Comparable<E>> implements Queue<E> {
55

6-
MaxHeap<E>? maxHeap;
6+
MaxHeap<E>? _maxHeap;
77

88
PriorityQueue(){
9-
maxHeap = new MaxHeap.withEmpty();
9+
_maxHeap = new MaxHeap.withEmpty();
1010
}
1111

1212
@override
1313
int? getSize(){
14-
return maxHeap!.size();
14+
return _maxHeap!.size();
1515
}
1616

1717
@override
1818
bool isEmpty(){
19-
return maxHeap!.isEmpty();
19+
return _maxHeap!.isEmpty();
2020
}
2121

2222
@override
2323
E getFront(){
24-
return maxHeap!.findMax();
24+
return _maxHeap!.findMax();
2525
}
2626

2727
@override
2828
enqueue(E e){
29-
maxHeap!.add(e);
29+
_maxHeap!.add(e);
3030
}
3131

3232
@override
3333
dequeue(){
34-
return maxHeap!.extractMax();
34+
return _maxHeap!.extractMax();
3535
}
3636
}

0 commit comments

Comments
 (0)