目录

  • 第一讲 基本概念
    • 1.1 什么是数据结构
        • 1.1.1 关于数据组织 - 例:图书摆放
        • 1.1.2 关于空间使用 - 例:PrintN函数实现
        • 1.1.3 关于算法效率 - 例:计算多项式值
          • 计算函数 花费的时间
        • 1.1.4 抽象数据类型
      • 1.2 什么是算法
        • 1.2.1 算法的定义
        • 1.2.2 什么是好的算法?
        • 1.2.3 复杂度的渐进表示
      • 1.3 应用实例:最大子列和问题
        • 1.3.1 应用实例 - 算法 1 & 2
        • 1.3.2 应用实例 - 算法 3
        • 1.3.3 应用实例 - 算法 4
  • 第一周的编程作业:
    • 01-复杂度1 最大子列和问题 (20分)
    • 01-复杂度2 Maximum Subsequence Sum (25分)
    • 01-复杂度3 二分查找 (20分)

视频地址
https://www.icourse163.org/course/ZJU-93001
https://www.bilibili.com/video/BV1H4411N7oD?p=1


第一讲 基本概念

1.1 什么是数据结构



1.1.1 关于数据组织 - 例:图书摆放

例1:如何在书架上摆放图书?
图书的摆放要使得2个相关操作方便实现:
操作1:新书怎么插入?
操作2:怎么找到某本指定的书?

解决问题方法的效率,跟数据的组织方式有关



1.1.2 关于空间使用 - 例:PrintN函数实现

例2:写程序实现一个函数PrintN,使得传入一个正整数为N的参数后,能顺序打印从1到N的全部正整数

// 循环实现
void PrintN(int N)
{int i;foro(i=1;i<=N;i++){printf("%d\n",i);}return ;
}// 递归实现
//递归的程序 对空间的占用有的时候可能是很恐怖的(数据量大时,爆栈的可能性极大)
void PrintN(int N)
{if(N){PrintN(N-1);printf("%d\n",N);}return ;
}
#include<stdio.h>
void PrintN(int N);
int main()
{int N;scanf("%d",&N);PrintN(N);return 0;
}

解决问题方法的效率,跟空间的利用效率有关



1.1.3 关于算法效率 - 例:计算多项式值


例3:写程序计算给定多项式在给定点x 处的值
f(x)=a0+a1x+...+an−1xn−1+anxnf(x) = a_{0} + a_{1}x + ... + a_{n-1}x^{n-1} + a_{n}x^n f(x)=a0​+a1​x+...+an−1​xn−1+an​xn


法1:

double f( int n, double a[], double x )
{ int i;double p = a[0];for ( i=1; i<=n; i++ )p += (a[i] * pow(x, i));return p;
}

法2:
提取公因子,此法更快
f(x)=a0+x(a1+x(...(an−1+x(an))...))f(x) = a_{0} + x( a_{1} + x(... (a_{n-1}+x(a_n)) ...) ) f(x)=a0​+x(a1​+x(...(an−1​+x(an​))...))

double f( int n, double a[], double x )
{ int i;double p = a[n];for ( i=n; i>0; i-- )p = a[i-1] + x*p;return p;
}

计算函数 花费的时间

clock():捕捉从程序开始运行到clock()被调用时所耗费的时间。这个时间单位是clock tick,即“时钟打点”。

常数CLK_TCK(或CLOCKS_PER_SEC):机器时钟每秒所走的时钟打点数。

#include <stdio.h>
#include <time.h>clock_t start, stop;/* clock_t是clock()函数返回的变量类型 */
double duration;/* 记录被测函数运行时间,以秒为单位 */int main ()
{/* 不在测试范围内的准备工作写在clock()调用之前*/start = clock();/* 开始计时 */MyFunction();/* 把被测函数加在这里 */stop = clock();/* 停止计时 */duration = ((double)(stop - start))/CLK_TCK;/* 计算运行时间 *//* 其他不在测试范围的处理写在后面,例如输出duration的值 */return 0;
}

使用上述两种函数进行测试

例3:写程序计算给定多项式
f(x)=∑i=09ixif(x) = \sum_{i=0}^{9}i x^i f(x)=i=0∑9​ixi
在给定点 x = 1.1 处的值 f(1.1)

double f1( int n, double a[], double x )
{ int i;double p = a[0];for ( i=1; i<=n; i++ )p += (a[i] * pow(x, i));return p;
} double f2( int n, double a[], double x )
{ int i;double p = a[n];for ( i=n; i>0; i-- )p = a[i-1] + x*p;return p;
}
#include <stdio.h>
#include <time.h>
#include <math.h>clock_t start, stop;
double duration;
#define MAXN 10 /* 多项式最大项数,即多项式阶数+1 */double f1( int n, double a[], double x );
double f2( int n, double a[], double x );int main ()
{ int i;double a[MAXN]; /* 存储多项式的系数 */for ( i=0; i<MAXN; i++ ) a[i] = (double)i;start = clock();f1(MAXN-1, a, 1.1);stop = clock();duration = ((double)(stop - start))/CLK_TCK;printf("ticks1 = %f\n", (double)(stop - start));printf("duration1 = %6.2e\n", duration);start = clock();f2(MAXN-1, a, 1.1);stop = clock();duration = ((double)(stop - start))/CLK_TCK;printf("ticks2 = %f\n", (double)(stop - start));printf("duration2 = %6.2e\n", duration);return 0;
}

发现结构皆为0!

为什么呢?

因为函数的运行时间不到一个CLK_TCK

那怎么测(这种运行很快的)函数的运行时间呢?重复运行多次/次数。

让被测函数重复运行充分多次,使得测出的总的时钟打点 间隔充分长,最后计算被测函数平均每次运行的时间即可!

#include <stdio.h>
#include <time.h>
#include <math.h>clock_t start, stop;
double duration;
#define MAXN 10 /* 多项式最大项数,即多项式阶数+1 */#define MAXK 1e7 /* 被测函数最大重复调用次数 */double f1( int n, double a[], double x );
double f2( int n, double a[], double x );int main ()
{ int i;double a[MAXN]; /* 存储多项式的系数 */for ( i=0; i<MAXN; i++ ) a[i] = (double)i;start = clock();for ( i=0; i<MAXK; i++ ) /* 重复调用函数以获得充分多的时钟打点数*/f1(MAXN-1, a, 1.1); stop = clock();duration = ((double)(stop - start))/CLK_TCK/MAXK; /* 计算函数单次运行的时间 */printf("ticks1 = %f\n", (double)(stop - start));printf("duration1 = %6.2e\n", duration);start = clock();for ( i=0; i<MAXK; i++ ) /* 重复调用函数以获得充分多的时钟打点数*/f2(MAXN-1, a, 1.1); stop = clock();duration = ((double)(stop - start))/CLK_TCK/MAXK;/* 计算函数单次运行的时间 */printf("ticks2 = %f\n", (double)(stop - start));printf("duration2 = %6.2e\n", duration);return 0;
}

解决问题方法的效率, 跟算法的巧妙程度有关



1.1.4 抽象数据类型


  • 数据对象在计算机中的组织方式

    • 逻辑结构
    • 物理存储结构
  • 数据对象必定与一系列加在其上的操作相关联
  • 完成这些操作所用的方法就是算法

抽象数据类型(Abstract Data Type )

  • 数据类型

    • 数据对象集
    • 数据集合相关联的操作集
  • 抽象:描述数据类型的方法不依赖于具体实现

    • 与存放数据的机器无关
    • 与数据存储的物理结构无关
    • 与实现操作的算法和编程语言均无关

只描述数据对象集和相关操作集 “是什么 ”,并不涉及 “如何做到 ”的问题



1.2 什么是算法



1.2.1 算法的定义


定义

  • 算法(Algorithm)

    • 一个有限指令集
    • 接受一些输入(有些情况下不需要输入)
    • 产生输出
    • 一定在有限步骤之后终止
    • 每一条指令必须
      • 有充分明确的目标,不可以有歧义
      • 计算机能处理的范围之内
      • 描述应不依赖于任何一种计算机语言以及具体的实现 手段

例1:选择排序算法的伪码描述

void SelectionSort ( int List[], int N )
{ /* 将N个整数List[0]...List[N-1]进行非递减排序 */for ( i = 0; i < N; i ++ ) {MinPosition = ScanForMin( List, i, N–1 );/* 从List[i]到List[N–1]中找最小元,并将其位置赋给MinPosition */Swap( List[i], List[MinPosition] );/* 将未排序部分的最小元换到有序部分的最后位置 */}
}

抽象

List到底是数组还是链表(虽然看上去很像数组)?

Swap用函数还是用宏去实现?



1.2.2 什么是好的算法?



1.2.3 复杂度的渐进表示



1.3 应用实例:最大子列和问题



1.3.1 应用实例 - 算法 1 & 2



算法1

int MaxSubseqSum1( int A[], int N )
{ int ThisSum, MaxSum = 0;int i, j, k;for( i = 0; i < N; i++ ) { /* i是子列左端位置 */for( j = i; j < N; j++ ) { /* j是子列右端位置 */ThisSum = 0; /* ThisSum是从A[i]到A[j]的子列和 */for( k = i; k <= j; k++ )ThisSum += A[k];if( ThisSum > MaxSum ) /* 如果刚得到的这个子列和更大 */MaxSum = ThisSum;  /* 则更新结果 */} /* j循环结束 */} /* i循环结束 */return MaxSum;
}

T(N)=O(N3)T(N) = O(N^{3}) T(N)=O(N3)


算法2

int MaxSubseqSum2( int A[], int N )
{ int ThisSum, MaxSum = 0;int i, j;for( i = 0; i < N; i++ ) { /* i是子列左端位置 */ThisSum = 0; /* ThisSum是从A[i]到A[j]的子列和 */for( j = i; j < N; j++ ) { /* j是子列右端位置 */ThisSum += A[j];/*对于相同的i,不同的j,只要在j-1次循环的基础上累加1项即可*/if( ThisSum > MaxSum ) /* 如果刚得到的这个子列和更大 */MaxSum = ThisSum; /* 则更新结果 */} /* j循环结束 */} /* i循环结束 */return MaxSum;
}

T(N)=O(N2)T(N) = O(N^{2}) T(N)=O(N2)



1.3.2 应用实例 - 算法 3


分而治之

int Max3( int A, int B, int C )
{ /* 返回3个整数中的最大值 */return A > B ? A > C ? A : C : B > C ? B : C;
}int DivideAndConquer( int List[], int left, int right )
{ /* 分治法求List[left]到List[right]的最大子列和 */int MaxLeftSum, MaxRightSum; /* 存放左右子问题的解 */int MaxLeftBorderSum, MaxRightBorderSum; /*存放跨分界线的结果*/int LeftBorderSum, RightBorderSum;int center, i;if( left == right )  { /* 递归的终止条件,子列只有1个数字 */if( List[left] > 0 )  return List[left];else return 0;}/* 下面是"分"的过程 */center = ( left + right ) / 2; /* 找到中分点 *//* 递归求得两边子列的最大和 */MaxLeftSum = DivideAndConquer( List, left, center );MaxRightSum = DivideAndConquer( List, center+1, right );/* 下面求跨分界线的最大子列和 */MaxLeftBorderSum = 0; LeftBorderSum = 0;for( i=center; i>=left; i-- ) { /* 从中线向左扫描 */LeftBorderSum += List[i];if( LeftBorderSum > MaxLeftBorderSum )MaxLeftBorderSum = LeftBorderSum;} /* 左边扫描结束 */MaxRightBorderSum = 0; RightBorderSum = 0;for( i=center+1; i<=right; i++ ) { /* 从中线向右扫描 */RightBorderSum += List[i];if( RightBorderSum > MaxRightBorderSum )MaxRightBorderSum = RightBorderSum;} /* 右边扫描结束 *//* 下面返回"治"的结果 */return Max3( MaxLeftSum, MaxRightSum, MaxLeftBorderSum + MaxRightBorderSum );
}int MaxSubseqSum3( int List[], int N )
{ /* 保持与前2种算法相同的函数接口 */return DivideAndConquer( List, 0, N-1 );
}


1.3.3 应用实例 - 算法 4

算法4:在线处理

int MaxSubseqSum4( int A[], int N )
{   int ThisSum, MaxSum;int i;ThisSum = MaxSum = 0;for( i = 0; i < N; i++ ) {ThisSum += A[i]; /* 向右累加 */if( ThisSum > MaxSum )MaxSum = ThisSum; /* 发现更大和则更新当前结果 */else if( ThisSum < 0 ) /* 如果当前子列和为负 */ThisSum = 0; /* 则不可能使后面的部分和增大,抛弃之 */}return MaxSum;
}

T(N)=O(N)T(N) = O(N) T(N)=O(N)

“在线” 的意思是指每输入一个数据就进行即时处理,在任何一个地方中止输入,算法都能正确给出当前的解。




第一周的编程作业:

1 最大子列和问题:是本次课最后讲到的4种算法的实验题,属于基本要求,一定要做;

2 Maximum Subsequence Sum:是2004年浙江大学计算机专业考研复试真题,要求略高,选做。其实也不难,是本次课最后讲到的算法的改造,挑战一下吧~

3 二分查找:配合课后讨论题给出这道函数填空题,学有余力、并且会C语言编程的你可以尝试一下。你只需要提交一个函数,而不用交如main函数之类的其他函数。不会C语言的话,就研究一下课后关于二分法的讨论题吧~



01-复杂度1 最大子列和问题 (20分)


题目网址

https://pintia.cn/problem-sets/1302953266564911104/problems/1302953426338533376


题目描述

给定K个整数组成的序列N1,N2,...,NK{ N_1, N_2 , ..., N_K}N1​,N2​,...,NK​,“连续子列”被定义为N​i,N​i+1,...,N​j{ N_​i, N_{​i+1}, ..., N_​j }N​​i,N​i+1​,...,N​​j,其中 1≤i≤j≤K。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4, 13 }有最大的和20。现要求你编写程序,计算给定整数序列的最大子列和。

本题旨在测试各种不同的算法在各种数据情况下的表现。各组测试数据特点如下:

数据1:与样例等价,测试基本正确性;
数据2:10^2个随机整数;
数据3:10^3个随机整数;
数据4:10^4个随机整数;
数据5:10^5个随机整数;

输入格式:
输入第1行给出正整数K (≤100000);第2行给出K个整数,其间以空格分隔。

输出格式:
在一行中输出最大子列和。如果序列中所有整数皆为负数,则输出0。

输入样例:
6
-2 11 -4 13 -5 -2

输出样例:
20


分析
使用的是“在线处理”方法,时间复杂度只有 O(n)


#include<stdio.h>
#include<stdlib.h>
#include<time.h>clock_t start, stop;
double duration;
#define MAXK 1e7 /* 被测函数最大重复调用次数 */#define ExecuteFirst trueint MaxSubseqSum(int arr[],int len)
{int ThisSum = 0,MaxSum = 0;for(int i=0;i<len;++i){ThisSum += arr[i];  /* 向右累加 */if(ThisSum > MaxSum)MaxSum = ThisSum;/* 发现更大和则更新当前结果 */else if(ThisSum < 0)ThisSum = 0;/* 如果当前子列和为负:则不可能使后面的部分和增大,抛弃之 */}return MaxSum;
}
int main()
{int max = 0;long int K,i=0;scanf("%lld",&K);int* _array = (int*)malloc(K*sizeof(int));while(i<K)scanf("%d",&_array[i++]);
#ifdef ExecuteFirst // cprintf("\nmaxSubseqSum = %d\n\n", MaxSubseqSum(_array,K));#else //本机测试start = clock();for ( i=0; i<MAXK; i++ ) /* 重复调用函数以获得充分多的时钟打点数*/max=MaxSubseqSum(_array,K);stop = clock();duration = ((double)(stop - start))/CLK_TCK/MAXK;/* 计算函数单次运行的时间 */printf("\nmaxSubseqSum = %d\n\n", max);printf("1e7次执行总时间 = %f\n", (double)(stop - start));printf("单词执行时间 = %6.2e\n", duration);
#endiffree(_array);getchar();return 0;
}

codeblocks17.12运行
https://sourceforge.net/projects/codeblocks/files/Binaries/17.12/Windows/


6
-2 11 -4 13 -5 -2maxSubseqSum = 201e7次执行总时间 = 343.000000
单词执行时间 = 3.43e-008Process returned 0 (0x0)
Press any key to continue.



01-复杂度2 Maximum Subsequence Sum (25分)


题目网址

https://pintia.cn/problem-sets/1302953266564911104/problems/1302953426338533377


题目描述

Given a sequence of K integers N1,N2,...,NK{ N_1, N_2 , ..., N_K}N1​,N2​,...,NK​. A continuous subsequence is defined to be N​i,N​i+1,...,N​j{ N_​i, N_{​i+1}, ..., N_​j }N​​i,N​i+1​,...,N​​jwhere 1≤i≤j≤K. The Maximum Subsequence is the continuous subsequence which has the largest sum of its elements. For example, given sequence { -2, 11, -4, 13, -5, -2 }, its maximum subsequence is { 11, -4, 13 } with the largest sum being 20.

Now you are supposed to find the largest sum, together with the first and the last numbers of the maximum subsequence.


Input Specification:

Each input file contains one test case. Each case occupies two lines. The first line contains a positive integer K (≤10000). The second line contains K numbers, separated by a space.


Output Specification:

For each test case, output in one line the largest sum, together with the first and the last numbers of the maximum subsequence. The numbers must be separated by one space, but there must be no extra space at the end of a line. In case that the maximum subsequence is not unique, output the one with the smallest indices i and j (as shown by the sample case). If all the K numbers are negative, then its maximum sum is defined to be 0, and you are supposed to output the first and the last numbers of the whole sequence.


Sample Input:
10
-10 1 2 3 4 -5 -23 3 7 -21

Sample Output:
10 1 4


分析

  1. 和上一题一样,返回最大子序列的和
  2. 并 返回 最大子序列的第一个和最后一个数
  3. 使用的是“在线处理”方法,时间复杂度只有 O(n)
    当序列全是负数的时候,输出 0(最大子列和),序列第一个数字,序列最后一个数字
    当序列只有 0 和负数时,输出 0(最大子列和),0 0
    注意最大子列和前面和后面为0的情况
    有多个最大子列和时,输出 i 和 j 最小的那个
    注意:举例的输出中 1 和 4 不是下标 而是数值
#include<stdio.h>
#include<stdlib.h>
#include<time.h>void MaxSubseqSum(int arr[],int len)
{int ThisSum = 0,MaxSum = 0;int leftIndexTmp = 0,leftIndex = 0,rightIndex = 0;for(int i=0;i<len;++i){ThisSum += arr[i];  /* 向右累加 */if(ThisSum < 0){/* 如果当前子列和为负:则不可能使后面的部分和增大,抛弃之 */ThisSum = 0;leftIndexTmp = i+1;//更新临时下标(暂且假定下一个数是最大子列的第一个数)}else if(ThisSum > MaxSum){/* 发现更大和则更新当前结果 */MaxSum = ThisSum;leftIndex = leftIndexTmp;//更新左下标rightIndex = i;//右下标}//else if(ThisSum == MaxSum) //不更新坐标}//当序列全是负数的时候,输出0(最大子列和),序列第一个数字,序列最后一个数字if(MaxSum < 0)printf("0 %d %d", arr[0], arr[len-1]);elseprintf("%d %d %d",MaxSum,arr[leftIndex], arr[rightIndex]);
}
int main()
{long int K,i=0;scanf("%lld",&K);int* _array = (int*)malloc(K*sizeof(int));while(i<K)scanf("%d",&_array[i++]);MaxSubseqSum(_array,K);free(_array);getchar();return 0;
}
10
-10 1 2 3 4 -5 -23 3 7 -21
10 1 4
Process returned 0 (0x0)
Press any key to continue.


01-复杂度3 二分查找 (20分)

本题要求实现二分查找算法。

函数接口定义:

Position BinarySearch( List L, ElementType X );

其中List结构定义如下:

typedef int Position;
typedef struct LNode *List;
struct LNode {ElementType Data[MAXSIZE];Position Last; /* 保存线性表中最后一个元素的位置 */
};

L是用户传入的一个线性表,其中ElementType元素可以通过>、==、<进行比较,并且题目保证传入的数据是递增有序的。函数BinarySearch要查找X在Data中的位置,即数组下标(注意:元素从下标1开始存储)。找到则返回下标,否则返回一个特殊的失败标记NotFound。

裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>#define MAXSIZE 10
#define NotFound 0
typedef int ElementType;typedef int Position;
typedef struct LNode *List;
struct LNode {ElementType Data[MAXSIZE];Position Last; /* 保存线性表中最后一个元素的位置 */
};List ReadInput(); /* 裁判实现,细节不表。元素从下标1开始存储 */
Position BinarySearch( List L, ElementType X );int main()
{List L;ElementType X;Position P;L = ReadInput();scanf("%d", &X);P = BinarySearch( L, X );printf("%d\n", P);return 0;
}/* 你的代码将被嵌在这里 */

输入样例1:
5
12 31 55 89 101
31

输出样例1:
2


输入样例2:
3
26 78 233
31

输出样例2:
0


Position BinarySearch1( List L, ElementType X )
{int left = 1;int right = L->Last;while(left <= right){int mid = left+(right-left)/2;if(L->Data[mid] == X)return mid;else if(L->Data[mid] < X)left = mid+1;else if(L->Data[mid] > X)right = mid-1;}return NotFound ;
}

数据结构-第一讲 基本概念-学习笔记(MOOC 浙江大学 陈越 何钦铭)相关推荐

  1. [数据结构] 第一讲 基本概念

    目录 一.概念 二.分类 一.概念 数据:是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符合集合. 数据元素:是组成数据的.有一定意义的基本单位,在计算机中通常 ...

  2. 陈越、何钦铭《数据结构》第一讲基本概念 笔记

    <数据结构>第一讲基本概念  1.1什么是数据结构 1.1.1关于数据组织-例:图书摆放 "数据结构是数据对象,以及存在于该对象的实例和组成实例的数据元素之间的各种联系.这些联系 ...

  3. 陈越《数据结构》第一讲 基本概念

    陈越<数据结构>第一讲 基本概念 1什么是数据结构 1.1 引子 例子:如何在书架上摆放图书? 随便放: 按照书名的拼音字母顺序排放: 把书架划分成几块区域,每块区域指定摆放某种类别的图书 ...

  4. Apollo星火计划学习笔记——第一讲 使用Apollo学习自动驾驶

    引言 如何学习自动驾驶? 自动驾驶是集车辆.计算机.电子电气.人工智能.通信等多学科应用为一体的的复杂系统.针对自身专业背景结合自动驾驶发展进行学习: 自动驾驶是通过智能系统来驾驶汽车从而取代了驾驶员 ...

  5. 学习笔记:星火第一讲-使用Apollo 学习自动驾驶

    星火第一讲-使用Apollo 学习自动驾驶 引言 如何学习自动驾驶? 自动驾驶是集车辆.计算机.电子电气.人工智能.通信等多学科应用为一体的的复杂系统.针对自身专业背景结合自动驾驶发展进行学习: 自动 ...

  6. 视觉SLAM十四讲学习笔记-第四讲---第五讲学习笔记总结---李群和李代数、相机

    第四讲---第五讲学习笔记如下: 视觉SLAM十四讲学习笔记-第四讲-李群与李代数基础和定义.指数和对数映射_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第四讲-李代数求导与扰动模 ...

  7. Java数据结构第一讲-排序算法

    常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...

  8. 深度学习第一讲之深度学习基础

    技术交流qq群: 659201069 深度学习第一讲之深度学习基础 转载请注明出处! 本篇博文从what.why.when.who.where.how五个方面来分析深度学习,接下来讲如何入门,我门将通 ...

  9. 并行算法第一讲:概念及目标

    文章目录 第一讲:概念及目标 并行算法的意义 提高性能的主要手段 现状 并行计算分类 并行计算互联网络 并行计算存储组织 Brent定理(work-time) PRAM上并行求和算法 并行算法设计与分 ...

最新文章

  1. C++中三种正则表达式比较
  2. 计算机应用基础851,清华大学851西方经济学考研参考书目及考研真题
  3. editor 插入图片之后将光标放到右侧_通过vscode插件自动上传剪贴板图片至aws s3
  4. Python 初学者的最佳学习资源
  5. 电脑运行adb闪退_adb命令调试工具
  6. oracle的catalog,Oracle Rman Catalog的创建方法和备份原理
  7. 苹果亚马逊同一天公布无损音质服务、 Google与Flutter、Snap 的 AR 战事等|Decode the Week...
  8. MEF 导入(Import)和导出(Export)
  9. java缓存技术_java缓存技术
  10. 多线程爬取新闻标题和链接
  11. Android 虚拟机与真机调试配置
  12. 【Vue】—数组对象变更检测
  13. AcWing 1058. 股票买卖 V
  14. VueRouter基础知识记录1
  15. Spring boot yml文件的书写格式
  16. java和javascript双引号嵌套的问题
  17. Android基于XMPP Smack Openfire开发IM(1)搭建openfire服务器
  18. Javaweb基础-SQL增删改查
  19. Lenovo 320-15IKB DG421 DG521 DG721 NM-B241 REV1.0笔记本点位图
  20. 谷歌大牛Jeff Dean撰文:深度学习研究的黄金十年

热门文章

  1. JS 逆向之 Hook
  2. 学钢琴时如何提高识谱能力
  3. Android 监听Home键按键事件
  4. SAS学习——SAS逻辑库
  5. html将页面分成四部分,将HTML页面拆分为定义的宽度和高度部分
  6. Python写一个自动化交易程序
  7. Unable to install breakpoint in
  8. 终结符号和非终结符号
  9. 驱动开发指南 第八章 汇编LED灯实验
  10. QWebEngineView如何忽略SSL证书错误