数据结构

译:MySQL性能优化的21条最佳经验

假如想象 提交于 2020-04-12 16:24:23
今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显。关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们 程序员 需要去关注的事情。当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能。这里,我们不会讲过多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库。希望下面的这些优化技巧对你有用。 0. 为查询缓存优化你的查询 大多数的MySQL服务器都开启了查询缓存。这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的。当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一个缓存中,这样,后续的相同的查询就不用操作表而直接访问缓存结果了。 这里最主要的问题是,对于程序员来说,这个事情是很容易被忽略的。因为,我们某些查询语句会让MySQL不使用缓存。请看下面的示例 // 查询缓存不开启 $r = mysql_query("SELECT username FROM user WHERE signup_date >= CURDATE()"); // 开启查询缓存 $today = date("Y-m-d"); $r = mysql_query("SELECT username FROM user WHERE signup_date >= '$today'");

数据结构-02-链表(Linkied List)

北慕城南 提交于 2020-04-09 09:51:54
##Linked List - 链表 链表是线性表的一种。线性表是最基本、最简单、也是最常用的一种数据结构。 线性表 中 数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的 。线性表有两种存储方式,一种是 顺序存储结构 ,另一种是 链式存储结构 。我们常用的数组就是一种典型的顺序存储结构。 相反, 链式存储结构 就是两个相邻的元素在内存中可能不是相邻的,每一个元素都有一个指针域,指 针域一般是存储着到下一个元素的指针 。这种存储方式的优点是插入和删除的时间复杂度为 O(1),不会浪费太多内存,添加元素的时候才会申请内存,删除元素会释放内存。缺点是访问的时间复杂度最坏为 O(n)。 顺序表的特性是随机读取,也就是访问一个元素的时间复杂度是O(1),链式表的特性是插入和删除的时间复杂度为O(1)。 链表 就是 链式存储的线性表 。根据 指针域 的不同,链表分为 单向链表、双向链表、循环链表 等等。 请看示例: class listNode: def __init__(self, val): self.val = val self.next = None ##链表的基本操作 ###反转链表 ####单向链表 链表的基本形式是:1 -> 2 -> 3 -> null,反转需要变为 3 -> 2 -> 1 -> null。这里要注意:

[算法] 刷题-数据结构

ε祈祈猫儿з 提交于 2020-04-08 12:57:40
索引 最小栈 全O1结构 LRU 题解 最小栈 class MinStack: def __init__(self): """ initialize your data structure here. """ self.stack = list() self.t_stack = list() def push(self, x: int) -> None: if len(self.stack) > 0 and x <= self.t_stack[-1]: self.t_stack.append(x) if len(self.stack) ==0: self.t_stack.append(x) self.stack.append(x) def pop(self) -> None: if len(self.stack) == 0: return None val = self.stack[-1] self.stack = self.stack[:-1] if val == self.t_stack[-1]: self.t_stack = self.t_stack[:-1] return val def top(self) -> int: if len(self.stack) == 0: return None return self.stack[-1] def getMin(self)

数据结构TIRE 树实际应用----过滤禁词

二次信任 提交于 2020-04-08 12:27:27
二叉树也是 递归 定义的,其结点有左右子树之分: (1) 完全二叉树 ——若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层有 叶子结点 ,并且叶子结点都是从左到右依次排布,这就是 完全二叉树 。 (2) 满二叉树 ——除了叶结点外每一个结点都有左右子叶且叶子结点都处在最底层的二叉树。 (3) 深度——二叉树的层数,就是高度。 1、二叉树的存储结构 (1)顺序存储结构(适合完全二叉树和满二叉树) (2)链式存储结构(适合非完全二叉树) 2、二叉树的遍历 (1)递归遍历(中序遍历、先序遍历、后序遍历) (2)非递归遍历(利用堆栈实现) 3、二叉树的拓展 (1)线索二叉树(在节点空指针域存放前驱和后继节点的指针,加上线索标志域区分是线索指针还是child指针;建立线索二叉树,实质上就是遍历一颗二叉树,在相应的指针域进行操作) (2)二叉排序树(了解生成过程) (3)最优二叉树(哈夫曼树):对于一组有确定权值的叶子节点,构造的具有最小带权路径长度的二叉树(典型应用:哈夫曼编码) (3)平衡树: 它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。(防止退化为链表,提高搜索效率) (4)红黑树:红黑树是平衡二叉树的一种;它有很好的性质,树中的结点都是有序的,而且因为它本身就是平衡的

数据结构---队列的实现

大憨熊 提交于 2020-04-08 11:57:47
在此之前,已经了解过顺序表和链表了,那么现在要了解的栈和队列,从本质上来说是基于上述俩个的,栈讲究“”后进先出”,而队列与之不同,要求“先进先出”,对于栈来说,根据规则,我们了解到,栈的“入栈”即为“尾插”,栈的出栈也要找到“尾数据”,考虑到实用性,我们的“栈“是基于顺序表完成的。这里就不细细展开了,而对于本次要讲的“队列”,根据使用规则,会发现,入队列类似“尾插”,出队列是“首”,因此,为了效率而言,“队列”会和单链表(此单链表具有尾指针,有尾指针弥补“尾插”效率)联系起来 下面我们来完成一个简单但通用的“队列” 1.首先呢,为了方便操作,我们建立一个自己的头文件·,(这个头文件后面会有引用),命名为 queue.h,顾名思义; #pragma once #include <stdlib.h> #include <stdio.h> typedef int QDataType; typedef struct QNode//创建一个结构体来放需要用到的Node { struct QNode* _next;//自己的指针 QDataType _data; }QNode; typedef struct Queue { QNode* _front;//首 QNode* _rear;/尾 QNode* _size;//此处size的创建便于后面检查队列满与空 }Queue; void

数据结构实验之栈与队列一:进制转换

独自空忆成欢 提交于 2020-04-07 10:39:04
数据结构实验之栈与队列一:进制转换 Description 输入一个十进制非负整数,将其转换成对应的 R (2 <= R <= 9) 进制数,并输出。 Input 第一行输入需要转换的十进制非负整数; 第二行输入 R。 Output 输出转换所得的 R 进制数。 Sample Input 1279 8 Output 2377 这题考了栈的进栈与出栈,其他的就是进制转换的模板了,由于只有2到9,还是比较简单的。 非线性 #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct node//栈的节点 { int data; struct node *next; }Node; typedef struct stack { Node *base,*top; }Stack; Node *newnode()//开辟一个节点 { Node *t; t = (Node *)malloc(sizeof(Node)); t->next = NULL; return t; } Stack *Newstack()//建立一个新栈 { Stack *t; t = (Stack *)malloc(sizeof(Stack)); t->top = newnode(); t->base = t->top; return t;

数据结构(C语言版)第四章:链表

别等时光非礼了梦想. 提交于 2020-04-07 07:21:10
4.1 指针 实际上并不推荐使用malloc和free,使用malloc还简单,但是当指针进行移动的时候,你如何确定在哪个地址上free内存,则是个大难题. 我们写个正常的malloc和free程序: #include <stdio.h> #include <stdlib.h> #include <string.h> int main( void ) { int *pi = ( int * )malloc( sizeof( int ) ); *pi = 4; printf("%d\n", *pi ); free( pi ); return 0; } 然后写个比较怪怪的函数: #include <stdio.h> #include <stdlib.h> #include <string.h> int main( void ) { char **pstr = ( char ** )malloc( sizeof( char ) * 100 ); *pstr = "hello world"; printf("%s\n", *pstr ); free( pstr ); return 0; } 这段代码至少对目前的我来说,有点怪异(虽然是我自己写出来的).写这段代码有以下的含义: 1. 对于char *,最好理解为字符串,而不是字符指针(虽然操作的时候,可以通过字符指针进行操作) 2.

es6 Iterator接口和for-of

亡梦爱人 提交于 2020-04-07 06:05:47
iterator接口 简介: Iterator 接口的目的,就是为所有数据结构,提供了一种统一的访问机制,即for...of循环(详见下文)。当使用for...of循环遍历某种数据结构时,该循环会自动去寻找 Iterator 接口。 iterator接口遍历过程 创建一个指针对象,指向当前数据结构的起始位置。也就是说,遍历器对象本质上,就是一个指针对象。 第一次调用指针对象的next方法,可以将指针指向数据结构的第一个成员。 第二次调用指针对象的next方法,指针就指向数据结构的第二个成员。 不断调用指针对象的next方法,直到它指向数据结构的结束位置。 凡是具有Symbol.iterator属性的数据就具备for-of遍历的功能 Symbol.iterator本身是一个函数,该函数返回一个具有next方法的对象(简称遍历对象),next方法则是返回一个获取下一个成员的信息 遍历对象除了有next方法,还可以部署return和throw方法 return方法的使用场合是,如果for...of循环提前退出(通常是因为出错,或者有break语句),就会调用return方法。如果一个对象在完成遍历前,需要清理或释放资源,就可以部署return方法。 throw方法主要是配合 Generator 函数使用,一般的遍历器对象用不到这个方法 下面见例子 例子一: next:()=>({

数据结构(C语言版)第五章:树

試著忘記壹切 提交于 2020-04-07 06:00:58
5.2 二叉树 我们写一个二叉树,它支持树的插入,删除,查询和遍历,而且左子树的数据都小于右子树的数据(PS:树实际上很难的,想深入了解的话,可以去看看<算法导论>,什么红黑树啊,B树啊什么的,反正我没看懂就是了--估计是我太菜了^_^): #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct TREE{ int data; struct TREE *leftChild; struct TREE *rightChild; }Tree; void insertTree( Tree *tree, int data ); void deleteTree( Tree *tree, int data ); int searchTree( Tree *tree, int data ); void showTree( Tree *tree ); int main( void ) { Tree *tree = ( Tree * )malloc( sizeof( Tree ) ); tree->leftChild = tree->rightChild = NULL; insertTree( tree, 5 ); insertTree( tree, 3 ); insertTree( tree, 2 );

concurrent包的数据结构

ぐ巨炮叔叔 提交于 2020-04-07 03:50:47
concurrent包的数据结构:阻塞的结构都是用lock加锁(lock会休眠锁),非阻塞是用CAS直接for循环加入。 结构简介 名称 功能 组成 原子量 AtomicBoolean Unsafe+==volatile int value== AtomicInteger Unsafe+==volatile int value== AtomicIntegerArray Unsafe+==final int[] array== AtomicLong Unsafe+==volatile long value== AtomicLongArray Unsafe+==final int[] array== 名称 功能 组成 阻塞队列 ==继承: BlockingQueue 接口== ArrayBlockingQueue 数组+lock LinkedBlockingQueue 链表+lock PriorityBlockingQueue**(优先级队列)** 自定义哪个队列先出 数组+lock DelayQueue (时间队列) 队列中每个元素都有个过期时间,并且队列是个优先级队列,当从队列获取元素时候,只有过期元素才会出队列 PriorityQueue(优先级队列)+lock SynchronousQueue 一个不存储元素的阻塞队列 阻塞队列(双端) ==继承: BlockingDeque