Hexo


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 日程表

Scala核心编程

发表于 2019-10-20 | 分类于 Scala
字数统计: | 阅读时长 ≈

简介

  1. Spark 新一代内存级大数据计算框架,是大数据的重要内容
  2. Scala 源代码被编译成Java字节码,所以它可以运行于JVM之上,并可以调用现有的Java类库。

Scala 特性

  • 面向对象特性
    类抽象机制的扩展有两种途径:一种途径是子类继承,另一种途径是灵活的混入机制。这两种途径能避免多重继承的种种问题。
  • 函数式编程
  • 静态类型
  • 扩展性
  • 并发性

安装

菜鸟Scala 安装
mac 安装
官网

Scala 基础语法

  • Scala 与 Java 的最大区别是:Scala 语句末尾的分号 ; 是可选的
  • 区分大小写 - Scala是大小写敏感的,这意味着标识Hello 和 hello在Scala中会有不同的含义
  • 类名 - 对于所有的类名的第一个字母要大写,示例:class MyFirstScalaClass
  • 方法名称 - 所有的方法名称的第一个字母用小写,示例:def myMethodName()
  • 程序文件名 - 程序文件的名称应该与对象名称完全匹配(新版本不需要了,但建议保留这种习惯),示例: 假设"HelloWorld"是对象的名称。那么该文件应保存为'HelloWorld.scala"
  • def main(args: Array[String]) - Scala程序从main()方法开始处理,这是每一个Scala程序的强制程序入口部分。

开始

GETTING STARTED WITH SCALA IN INTELLIJ

Scala Worksheet

它类似于交互式命令行的代码测试,在Worksheet输入scala表达式,保存以后会立即得到程序运行的结果,不用推出ideal

报错 Internal Error: null while running Scala Worksheet

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
Internal error: null
org.jetbrains.jps.incremental.scala.remote.ClientEventProcessor.process(ClientEventProcessor.scala:22)
org.jetbrains.jps.incremental.scala.remote.RemoteResourceOwner.handle(RemoteResourceOwner.scala:47)
org.jetbrains.jps.incremental.scala.remote.RemoteResourceOwner.handle$(RemoteResourceOwner.scala:37)
org.jetbrains.plugins.scala.compiler.RemoteServerRunner.handle(RemoteServerRunner.scala:16)
org.jetbrains.jps.incremental.scala.remote.RemoteResourceOwner.$anonfun$send$5(RemoteResourceOwner.scala:30)
org.jetbrains.jps.incremental.scala.remote.RemoteResourceOwner.$anonfun$send$5$adapted(RemoteResourceOwner.scala:29)
org.jetbrains.jps.incremental.scala.package$.using(package.scala:21)
org.jetbrains.jps.incremental.scala.remote.RemoteResourceOwner.$anonfun$send$3(RemoteResourceOwner.scala:29)
org.jetbrains.jps.incremental.scala.remote.RemoteResourceOwner.$anonfun$send$3$adapted(RemoteResourceOwner.scala:25)
org.jetbrains.jps.incremental.scala.package$.using(package.scala:21)
org.jetbrains.jps.incremental.scala.remote.RemoteResourceOwner.$anonfun$send$2(RemoteResourceOwner.scala:25)
org.jetbrains.jps.incremental.scala.remote.RemoteResourceOwner.$anonfun$send$2$adapted(RemoteResourceOwner.scala:24)
org.jetbrains.jps.incremental.scala.package$.using(package.scala:21)
org.jetbrains.jps.incremental.scala.remote.RemoteResourceOwner.send(RemoteResourceOwner.scala:24)
org.jetbrains.jps.incremental.scala.remote.RemoteResourceOwner.send$(RemoteResourceOwner.scala:22)
org.jetbrains.plugins.scala.compiler.RemoteServerRunner.send(RemoteServerRunner.scala:16)
org.jetbrains.plugins.scala.compiler.RemoteServerRunner$$anon$1.$anonfun$run$1(RemoteServerRunner.scala:36)
scala.collection.immutable.Range.foreach$mVc$sp(Range.scala:156)
org.jetbrains.plugins.scala.compiler.RemoteServerRunner$$anon$1.run(RemoteServerRunner.scala:32)
org.jetbrains.plugins.scala.worksheet.server.RemoteServerConnector.compileAndRun(RemoteServerConnector.scala:111)
org.jetbrains.plugins.scala.worksheet.processor.WorksheetCompiler$$anon$4.run(WorksheetCompiler.scala:81)
com.intellij.compiler.progress.CompilerTask.run(CompilerTask.java:185)
com.intellij.openapi.progress.impl.CoreProgressManager$TaskRunnable.run(CoreProgressManager.java:727)
com.intellij.openapi.progress.impl.CoreProgressManager.lambda$runProcess$2(CoreProgressManager.java:164)
com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:582)
com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:532)
com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:87)
com.intellij.openapi.progress.impl.CoreProgressManager.runProcess(CoreProgressManager.java:151)
com.intellij.openapi.progress.impl.CoreProgressManager$4.run(CoreProgressManager.java:403)
com.intellij.openapi.application.impl.ApplicationImpl$1.run(ApplicationImpl.java:314)
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
java.util.concurrent.FutureTask.run(FutureTask.java:266)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
java.lang.Thread.run(Thread.java:745)

解决办法:
settings of the worksheet from <Run type: REPL> into <Run type:plain> and it worked.
Internal Error: null while running Scala Worksheet

1
2
3
4
5
6
7
// object表示一个伴生对象,可以理解就是一个对象
// Hello就是对象名字,它底层真正对应的类名是Hello$
object Hello {
def main(args: Array[String]): Unit = {
print("hello world")
}
}
1
2
3
object Hello extends App {
print("hello world")
}

mac下mysql安装与压测

发表于 2019-10-18 | 分类于 mysql
字数统计: | 阅读时长 ≈

安装mysql5.6

1
2
安装过的需要清理干净
brew install mysql@5.6

压测

1
2
3
4
5
brew install sysbench

sysbench --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password='' --test=/usr/local/Cellar/sysbench/1.0.17/share/sysbench/tests/include/oltp_legacy/oltp.lua --oltp_tables_count=10 --oltp-table-size=1000000 --rand-init=on prepare

sysbench --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password="" --test=/usr/local/Cellar/sysbench/1.0.17/share/sysbench/tests/include/oltp_legacy/oltp.lua --oltp_tables_count=6 --oltp-table-size=13000000 --num-threads=500 --oltp-read-only=off --report-interval=10 --rand-type=uniform --max-time=600 --max-requests=0 --percentile=99 run

sql语法解析

发表于 2019-10-17 | 分类于 mysql
字数统计: | 阅读时长 ≈

lex 和 yacc 是什么,为什么人们同时提及它们
lex 和 yacc 是一对配对工具。lex 将文件分解为成组的“记号(tokens)”,大体上类似于单词。yacc 接受 成组的记号,并将它们装配为高层次的结构,类似于句子

yacc 的语法

  • 结构,由%%分割的三部分组成:声明 %% 规则 %% 程序
  • %{与%}之间的代码将会直接出现在目标代码中
  • yacc 命令忽略语法文件中的空格、制表符和换行符
  • 注释:/* This is a comment on a line by itself. */
  • 使用’’(单引号)表示字符串
  • 优先顺序规则由 %prec 关键字定义,并更改与特定的语法规则关联的优先顺序级别。保留符号 %prec 可紧跟在语法规则的主体后面,且其后可有标记名称或者文字。构造使得语法规则的优先顺序成为标记名称或者文字的优先顺序。
  • yacc 生成的解析器将首先尝试去解析在文件的规则部分得到的第一个规则的实例, %start 来指定从哪个开始
  • $$符号可引用产生式左部非终结符的属性值,而$i则可以引用产生式右部第i个文法符号的属性值

编译生产go

1
2
goyacc -o sqlTest.go sql_test.y
gofmt -w sqlTest.go

EBNF文法

  1. ebnf2y安装
    1
    2
    3
    4
    5
    "github.com/cznic/ebnfutil"
    "github.com/cznic/strutil"
    替换成
    "modernc.org/ebnfutil"
    "modernc.org/strutil"

执行make

  1. EBNF文法
1
2
3
4
5
6
7
::= 表示定义;
< > 尖括号里的内容表示必选内容;
[ ] 中是可选项;
" " 双引号里的内容表示字符;
| 竖线两边的是可选内容,相当于or;
* 表示零个或者多个……
+ 表示一个或者多个……

解释:

$$符号可引用产生式左部非终结符的属性值,而$i则可以引用产生式右部第i个文法符号的属性值

1
2
3
4
5
6
7
8
9
into_table_name:
INTO table_name
{
$$ = $2
}
| table_name
{
$$ = $1
}

即$2代表table_name,赋值给$$

参考

anko 源代码阅读之 go 的 lex/yacc
YACC(BISON)使用指南
如何使用Lex/YACC
TiDB 源码阅读系列文章(五)TiDB SQL Parser 的实现
扩展巴科斯范式(EBNF)简介
BNF 以及 EBNF

start

发表于 2019-10-16 | 分类于 kafka
字数统计: | 阅读时长 ≈

Kafka Tool

开始

发表于 2019-10-15 | 分类于 leetcode
字数统计: | 阅读时长 ≈

推荐:

Huahua’s Tech Road

八大排序总结

发表于 2019-10-12 | 分类于 算法 , 八大排序
字数统计: | 阅读时长 ≈

八大排序

https://blog.csdn.net/foreverling/article/details/43798223#_147

快排

  • 技巧
    不要使用断言,java的断言是默认关闭的
    java使用assert断言时不起作用的解决办法

插入排序

发表于 2019-10-12 | 分类于 算法 , 八大排序
字数统计: | 阅读时长 ≈

插入排序

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
package cn.llnn.sort;

import java.util.Arrays;

/**
* 插入排序
*
* @author llnn
* @create 2019-09-26 18:01
**/
public class InsertSort {
public static void main(String[] args) {
int[] a = {51, 46, 20, 18, 65, 97, 82, 30, 77, 50};
System.out.println("待排序:" + Arrays.toString(a));
insertSort(a);
System.out.println("结果:" + Arrays.toString(a));
}

private static void insertSort(int[] a) {
for (int i = 1; i < a.length; i++) {
int temp = a[i];
int j = i;
while (j > 0 && a[j - 1] > temp) {
a[j] = a[j - 1];
j--;
}
a[j] = temp;
}

}

}

冒泡排序

发表于 2019-10-12 | 分类于 算法 , 八大排序
字数统计: | 阅读时长 ≈

冒泡排序

##算法步骤

1)比较相邻的元素。如果第一个比第二个大,就交换他们两个。

2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。

3)针对所有的元素重复以上的步骤,除了最后一个。

4)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

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
package cn.llnn.sort;

import java.util.Arrays;

/**
* 冒泡排序
*
* @author llnn
* @create 2019-09-26 17:41
**/
public class BubbleSort {
public static void main(String[] args) {
int[] a = {51, 46, 20, 18, 65, 97, 82, 30, 77, 50};
System.out.println("待排序:" + Arrays.toString(a));
bubbleSort(a);
System.out.println("结果:" + Arrays.toString(a));
}

private static void bubbleSort(int[] a) {
for (int i = 0; i <= a.length - 2; i++) {
for (int j = i + 1; j <= a.length - 1; j++) {
if (a[i] > a[j]) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
}
}

https://www.jianshu.com/p/ad84fd4dd4e2

堆排序

发表于 2019-10-12 | 分类于 算法 , 八大排序
字数统计: | 阅读时长 ≈

堆排序

最大堆,最小堆:

  • 最大堆:
    堆的最大元素存放在根结点中。并且,在任一子树中,该子树所包含的所有结点的值都不大于该子树根结点的值。即:A[PARENT(i) ≥ A[i]。堆排序使用最大堆。
  • 最小堆:
    堆的最小元素存放在根结点中。并且,在任一子树中,该子树所包含的所有结点的值都不小于该子树根结点的值。即:A[PARENT(i) ≤ A[i]。最小堆常用来构造优先队列。

将数组A看成一颗近似完全二叉树:

  • 树的第一个根节点是A[0],最后一个根节点A[len(A)//2 - 1]
  • 假定一个结点下标是i,则它的父节点,左孩子,右孩子下标如下:
    1
    2
    LEFT(i) : return 2i+1 
    RIGHT(i) : return 2i+2
  1. 如何建最大堆
  2. 如何维护最大堆
  3. 排序
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
package cn.llnn.sort;

import java.util.Arrays;

/**
* 堆排序,最大堆
*
* @author llnn
* @create 2019-09-26 12:57
**/
public class HeapSort {
private static int heapSize;

public static void main(String[] args) {
int[] a = {51, 46, 20, 18, 65, 97, 82, 30, 77, 50};
System.out.println("待排序:" + Arrays.toString(a));
heapSort(a);
System.out.println("结果:" + Arrays.toString(a));
}

private static void heapSort(int[] a) {
heapSize = a.length;
buildMaxHeap(a);
System.out.println("最大堆:" + Arrays.toString(a));
System.out.println("==============");
for (int i = a.length - 1; i >= 0; i--) {
int temp = a[0];
a[0] = a[i];
a[i] = temp;
// 调整数组大小
heapSize--;
adjustHeap(a, 0);
System.out.println(Arrays.toString(a));
}
System.out.println("==============");
}

private static void buildMaxHeap(int[] a) {
for (int i = heapSize / 2; i >= 0; i--) {
adjustHeap(a, i);
}
}

private static void adjustHeap(int[] a, int root) {
int large = root;
int leftChild = 2 * root + 1;
int rightChild = 2 * root + 2;
// 最小堆 a[leftChild] < a[root]
if (leftChild < heapSize - 1 && a[leftChild] > a[root]) {
large = leftChild;
}
// 最小堆 a[leftChild] < a[root]
if (rightChild < heapSize - 1 && a[rightChild] > a[large]) {
large = rightChild;
}


if (large != root) {
int temp = a[root];
a[root] = a[large];
a[large] = temp;
adjustHeap(a, large);
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
待排序:[51, 46, 20, 18, 65, 97, 82, 30, 77, 50]
最大堆:[97, 77, 82, 46, 65, 20, 51, 30, 18, 50]
==============
[82, 77, 51, 46, 65, 20, 50, 30, 18, 97]
[77, 65, 51, 46, 18, 20, 50, 30, 82, 97]
[65, 46, 51, 30, 18, 20, 50, 77, 82, 97]
[51, 46, 50, 30, 18, 20, 65, 77, 82, 97]
[50, 46, 20, 30, 18, 51, 65, 77, 82, 97]
[46, 18, 20, 30, 50, 51, 65, 77, 82, 97]
[30, 18, 20, 46, 50, 51, 65, 77, 82, 97]
[20, 18, 30, 46, 50, 51, 65, 77, 82, 97]
[18, 20, 30, 46, 50, 51, 65, 77, 82, 97]
[18, 20, 30, 46, 50, 51, 65, 77, 82, 97]
==============
结果:[18, 20, 30, 46, 50, 51, 65, 77, 82, 97]

https://ictar.xyz/2015/12/07/%E4%B9%9D%E5%A4%A7%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95%E5%8F%8A%E5%85%B6Python%E5%AE%9E%E7%8E%B0%E4%B9%8B%E5%A0%86%E6%8E%92%E5%BA%8F/

归并排序

发表于 2019-10-12 | 分类于 算法 , 八大排序
字数统计: | 阅读时长 ≈

归并排序

归并排序基本原理是合并两个已排序的数组
https://www.cnblogs.com/chengxiao/p/6194356.html

递归实现,自顶向下,between top down merge:

非递归,自底向上,bottom up merge sort:

递归就是把大问题拆解成一个个小问题,最后拆成两两相邻元素比较.

java实现:

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
package cn.llnn.sort;

import java.util.Arrays;

/**
* 归并排序
*
* @author llnn
* @create 2019-09-23 21:47
**/
public class MergeSort {

private static void merge(int[] a, int low, int mid, int high) {
int[] temp = new int[high - low + 1];
int l = low;
// 这里为什么要加1
int h = mid + 1;
int k = 0;
// 为什么要小于等于
while (l <= mid && h <= high) {
if (a[l] < a[h]) {
temp[k++] = a[l++];
} else {
temp[k++] = a[h++];
}

}
// 因为要遍历到最后一个元素,所以是小于等于
while (l <= mid) {
temp[k++] = a[l++];
}
while (h <= high) {
temp[k++] = a[h++];
}
if (temp.length >= 0) {
System.arraycopy(temp, 0, a, low, temp.length);
}
System.out.println(Arrays.toString(a));
}

private static void mergeSort(int[] a, int low, int high) {
/*
递归实现,自顶向下,between top down merge
*/
if (low >= high) {
return;
}
int mid = (low + high) / 2;
// 为啥high是mid,不是mid -1
mergeSort(a, low, mid);
mergeSort(a, mid + 1, high);
merge(a, low, mid, high);
}

private static void mergeSort2(int[] a) {
/*
非递归,自底向上,bottom up merge sort
*/
int N = a.length;
/* 第一层循环 表示归并排序子数组的长度 从1 , 2 , 4 ,8 ..... */
for (int sz = 1; sz < N; sz *= 2) {
System.out.println("sz" + sz);
//第二层循环表示每两个自数组之间归并排序,确定起始和终止INDEX
for (int lo = 0; lo < N - sz; lo += 2 * sz) {
System.out.println("low:" + lo + "mid" + (lo + sz - 1) + "high" + Math.min(lo + 2 * sz - 1, N - 1));
merge(a, lo, lo + sz - 1, Math.min(lo + sz + sz - 1, N - 1));
}
}
}

public static void main(String[] args) {
int[] a = {51, 46, 20, 18, 65, 97, 82, 30, 77, 50};
mergeSort(a, 0, a.length - 1);
// mergeSort2(a);
System.out.println("排序结果:" + Arrays.toString(a));
}

}

python实现:

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

def merge(arr, low, mid, high):
l = low
h = mid + 1
temp = []

while l <= mid and h <= high:
if arr[l] < arr[h]:
temp.append(arr[l])
l += 1
else:
temp.append(arr[h])
h += 1

while l <= mid:
temp.append(arr[l])
l += 1
while h <= high:
temp.append(arr[h])
h += 1
for i in temp:
arr[low] = i
low += 1
print(arr)


def merge_sort(arr, low, high):
# 为啥是大于等于
if low >= high:
return
mid = int((low + high) / 2)
# 为啥high是mid,不是mid-1
merge_sort(arr, low, mid)
merge_sort(arr, mid + 1, high)
merge(arr, low, mid, high)
pass


def merge_sort1(arr):
size = 1
while size < len(arr):
low = 0
while low < len(arr) - size:
high = min(2 * size + low - 1, len(arr) - 1)
mid = low + size - 1
merge(arr, low, mid, high)
low += 2 * size
size = 2 * size


if __name__ == '__main__':
arr = [51, 46, 20, 18, 65, 97, 82, 30, 77, 50]
# merge_sort(arr, 0, len(arr) - 1)
merge_sort1(arr)
print(arr)

边界界定:

非递归方法,边界界定:

  1. 让相邻的两个数组进行归并,保证相邻的两个元素是有序的.
  2. 由于相邻两个数组变成有序了,所以子数组长度是按2的指数增长的1,2,4,8…
  3. 需要找出low,mid,high 之前的关系

递归方法:

参考:

https://www.cnblogs.com/edwinchen/p/4783218.html
https://blog.csdn.net/MoreWindows/article/details/6678165
https://blog.csdn.net/jianyuerensheng/article/details/51262984
bottom up merge sort

1…678
John Doe

John Doe

78 日志
26 分类
27 标签
© 2019 John Doe | Site words total count:
本站访客数:
|
博客全站共字
|
主题 — NexT.Mist v5.1.4