0%

二叉堆C++实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
class BinaryHeap
{
public:
void push(int v);
int pop();
int get_heap_size() { return binary_heap.size(); }
int peak_top() { return index_at(1); };
int index_at(int i) { return binary_heap[i - 1]; }
void set_at(int i, int v) { binary_heap[i - 1] = v; };
private:
void adjust_heap(int idx);
void adjust_heap_down(int idx);
int compare(int left, int right);

std::vector<int> binary_heap = {};
static int index;
};

int BinaryHeap::index = 0;


// 往二叉堆中插入元素
void BinaryHeap::push(int v)
{
binary_heap.push_back(v);
index++;

if (binary_heap.size() == 1)
return;

// 调整堆
adjust_heap(index);
}

// 获取二叉堆中的堆顶元素
int BinaryHeap::pop()
{
if (!binary_heap.size()) return -1;

// 将最后一个叶子节点换到头节点
int ret = index_at(1);
binary_heap[1] = index_at(index);

adjust_heap_down(1);

return ret;
}

// 调整堆
void BinaryHeap::adjust_heap(int idx)
{
int root;
int tmp;

while ((root = idx / 2) > 0 && compare(index_at(idx), index_at(root)) < 0)
{
tmp = index_at(idx);
set_at(idx, index_at(root));
set_at(root, tmp);

idx = root;
}


}

// 向下调整堆
void BinaryHeap::adjust_heap_down(int idx)
{
int lchild;
int tmp;

while ((lchild = 2 * idx) <= index)
{
if (lchild + 1 <= index && compare(index_at(lchild + 1), index_at(lchild)) < 0)
lchild = lchild + 1;

if (compare(index_at(lchild), index_at(idx)))
{
tmp = index_at(idx);
set_at(idx, index_at(lchild));
set_at(lchild, tmp);
}

idx = lchild;
}
}

// 比较器
int BinaryHeap::compare(int l, int r)
{
return l - r;
}

int main()
{
BinaryHeap binaryh;
binaryh.push(12);
binaryh.push(17);
binaryh.push(11);

std::cout << binaryh.peak_top() << std::endl;


}

命名规范

  1. 函数名第一个字母大写,其后每个单词字母开头大写,驼峰式
  2. 变量名小写,单词之间下划线连接
  3. 类名,驼峰式。
阅读全文 »

explain

1
explain select * from table

explain用在查询语句之前,会输出一个表,表中的每个字段有着各自的含义:

阅读全文 »

乌黑,冰冷,坚硬,沉重的枷锁
它并不去断裂
而是融化在滚烫鲜红的血液里
留下一瞬的气泡,不断的破碎

阐述每种排序方法的思想与复杂度。假设数组大小为$n$,且从小到大排列。

冒泡排序

每一趟排序:两两元素进行比较并交换位置,核心代码如下

阅读全文 »

设样本有$m$个类别,$v$是属性中不同值的数量

ID3算法-信息熵

信息量

分类所期望的信息量: $I=-\sum_{i=1}^{m}\frac{s_{i}}{s}log_{2}(\frac{s_{i}}{s})$

阅读全文 »

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Solution {
public boolean hasCycle(ListNode head) {
if(head == null){
return false;
}
ListNode slow = head;
ListNode fast = head.next;
while(slow != fast){
if(fast == null || fast.next == null){
return false;
}
slow = slow.next;
fast = fast.next.next;
}
return true;
}
}
阅读全文 »

四种隔离级别

  • 未提交读:READ UNCOMMITTED
  • 提交读:READ COMMITTED
  • 可重复读(默认):REPEATABLE READ
  • 可序列化:SERIALIZABLE
阅读全文 »

java基础

常用数据类型

  • 基本类型:byte, short, int, long, float, double, boolean, char
  • 引用类型:String, 类
阅读全文 »

经验误差与过拟合

  • 错误率:如果在$m$个样本中有$a$个样本分类错误,则错误率$E=\frac{a}{m}$
  • 精度(accuracy):$1-\frac{a}{m}$,即“精度=1-错误率”
  • 误差:学习器的实际预测输出与样本的真实输出之间的差异
  • 训练误差:学习器在训练集上的误差。
  • 泛化误差:学习器在新样本上的误差。
  • 过拟合(overfitting)欠拟合(underfitting)
阅读全文 »