remove
This commit is contained in:
@@ -1,31 +0,0 @@
|
|||||||
/*
|
|
||||||
### B树基础
|
|
||||||
|
|
||||||
B树即B-tree(B树就是B-tree),B是balanced,也就是平衡的意思。
|
|
||||||
|
|
||||||
B树又叫平衡多路查找树,节点的直接点个数可以多于2个,一颗m阶的B树:
|
|
||||||
|
|
||||||
1) 树中每个节点做多含有m个子节点
|
|
||||||
2) 根节点不是叶子节点,至少有2个孩子
|
|
||||||
3) 所有叶子节点在同一层
|
|
||||||
4) 除根节点和叶子节点外,每个分支节点至少有[m/2]个子树
|
|
||||||
5) 有j个孩子的非叶子节点有 j-1 个关键码,关键码递增一次排列
|
|
||||||
|
|
||||||
|
|
||||||
### B树应用
|
|
||||||
|
|
||||||
数据库
|
|
||||||
文件系统
|
|
||||||
|
|
||||||
|
|
||||||
### B树存储结构
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### B树问题和延伸阅读
|
|
||||||
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,349 +0,0 @@
|
|||||||
/**
|
|
||||||
* 第一次题目 :构建二叉树(链表存储方式),空格表示空树,实现二叉树的基本操作:创建,遍历(先,中,后,按层)二叉树
|
|
||||||
* 提交邮箱 :[email protected] to [email protected]
|
|
||||||
* 邮件题目 :第一期第一次作业
|
|
||||||
**/
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct BiTNode{
|
|
||||||
|
|
||||||
char item;
|
|
||||||
struct BiTNode *lChild,*rChild;
|
|
||||||
|
|
||||||
}BiTNode,*BiTree;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// ==========================================================================
|
|
||||||
|
|
||||||
|
|
||||||
#define OK 1
|
|
||||||
#define ERROR 0
|
|
||||||
typedef int bool;
|
|
||||||
|
|
||||||
|
|
||||||
typedef BiTree ElemType ; // 也可能是一个复杂的复合类型
|
|
||||||
typedef int Status;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//队列的顺序存储
|
|
||||||
typedef struct Node{
|
|
||||||
|
|
||||||
ElemType *elem;
|
|
||||||
ElemType *head;
|
|
||||||
ElemType *tail;
|
|
||||||
int length; // 当前队列的长度
|
|
||||||
int size; // 队列容器的长度,在队列慢得时候可以扩容
|
|
||||||
|
|
||||||
|
|
||||||
}SqQueue;
|
|
||||||
|
|
||||||
//
|
|
||||||
// 在队列采用顺序存储时,有一个毛病,就是队列操作一段时间后,头指针到了队列容器的尾部,而头指针前面的容器内存不可用了,
|
|
||||||
//造成内存极大的浪费,这个问题可以通过循环队列来解决。但是在
|
|
||||||
// 链式队列上则不存在这样的问题
|
|
||||||
//
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct QNode{
|
|
||||||
|
|
||||||
struct QNode *next;
|
|
||||||
ElemType elem;
|
|
||||||
|
|
||||||
}LinkQueue;
|
|
||||||
|
|
||||||
|
|
||||||
// 队列需要维护两个 指针 (队头指针,队尾指针)
|
|
||||||
|
|
||||||
typedef struct{
|
|
||||||
|
|
||||||
LinkQueue *head;
|
|
||||||
LinkQueue *tail;
|
|
||||||
int length;
|
|
||||||
|
|
||||||
}Queue;
|
|
||||||
|
|
||||||
|
|
||||||
Status initQueue(Queue *queue);// 带头结点,没有引用传值,就用指针的指针吧
|
|
||||||
bool isEmpty(Queue *q);
|
|
||||||
int length(Queue *q);
|
|
||||||
|
|
||||||
|
|
||||||
// 在头部插入,尾部删除
|
|
||||||
Status getHead(Queue *q,ElemType *e);
|
|
||||||
Status enQueue(Queue *q,ElemType e);
|
|
||||||
Status deQueue(Queue *q,ElemType *e);
|
|
||||||
|
|
||||||
void traveser(Queue *q);
|
|
||||||
|
|
||||||
|
|
||||||
Status initQueue(Queue *queue){// 带头结点,没有引用传值,就用指针的指针吧
|
|
||||||
|
|
||||||
LinkQueue *lq = (LinkQueue *)malloc(sizeof(LinkQueue));
|
|
||||||
if (!lq) {
|
|
||||||
return ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
lq->elem = NULL;
|
|
||||||
lq->next = NULL;
|
|
||||||
|
|
||||||
(queue)->head = (queue)->tail = lq; // -> 优先级高于 * ,老老实实打上括号
|
|
||||||
(queue)->length = 0;
|
|
||||||
|
|
||||||
return OK;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isEmpty(Queue *q){
|
|
||||||
|
|
||||||
return (q->head == q->tail);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
int length(Queue *q){
|
|
||||||
|
|
||||||
// int ret;
|
|
||||||
// LinkQueue *p = q->head;
|
|
||||||
// while (p != q->tail) {
|
|
||||||
// ret++;
|
|
||||||
// p = p->next;
|
|
||||||
//
|
|
||||||
// }
|
|
||||||
|
|
||||||
return q->length;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
Status getHead(Queue *q,ElemType *e){
|
|
||||||
|
|
||||||
LinkQueue *p = q->head->next;
|
|
||||||
if (!p) {
|
|
||||||
*e=NULL;
|
|
||||||
return ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
*e = p->elem;
|
|
||||||
return OK;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// 入队(加入到队尾)
|
|
||||||
Status enQueue(Queue *q,ElemType e){
|
|
||||||
|
|
||||||
LinkQueue *newNode = (LinkQueue *)malloc(sizeof(LinkQueue));
|
|
||||||
if (!newNode) {
|
|
||||||
return ERROR;
|
|
||||||
}
|
|
||||||
newNode->elem = e;
|
|
||||||
newNode->next = NULL;
|
|
||||||
q->tail->next = newNode;
|
|
||||||
q->tail = newNode;
|
|
||||||
|
|
||||||
q->length++;
|
|
||||||
|
|
||||||
return OK;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//出队(队头). 注意,可能只有1个元素,造成队尾指针丢失
|
|
||||||
Status deQueue(Queue *q,ElemType *e){
|
|
||||||
|
|
||||||
LinkQueue *p = q->head->next;
|
|
||||||
if (!p) {// 队列空
|
|
||||||
return ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (e) {
|
|
||||||
*e = p->elem ;
|
|
||||||
}
|
|
||||||
|
|
||||||
LinkQueue *temp = p->next;
|
|
||||||
q->head->next = temp;
|
|
||||||
if (p == q->tail) {
|
|
||||||
q->tail = q->head;
|
|
||||||
}
|
|
||||||
free(p);
|
|
||||||
|
|
||||||
|
|
||||||
q->length--;
|
|
||||||
|
|
||||||
return OK;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void traveser(Queue *q){
|
|
||||||
|
|
||||||
LinkQueue *p = q->head->next;
|
|
||||||
while (NULL != p) {
|
|
||||||
//printf("%d\n",p->elem);
|
|
||||||
p=p->next;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ==================================================
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
int CreateBiTree(BiTree *T)
|
|
||||||
{
|
|
||||||
|
|
||||||
*T = (BiTNode *)malloc(sizeof(BiTNode));
|
|
||||||
if (*T==NULL)
|
|
||||||
{
|
|
||||||
printf("memery malloc failure !\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("enter data to create node:\n");
|
|
||||||
scanf("%c",&((*T)->item));
|
|
||||||
if((*T)->item=='#'){
|
|
||||||
*T=NULL;
|
|
||||||
}
|
|
||||||
if(*T){
|
|
||||||
printf("创建左子树:\n");
|
|
||||||
CreateBiTree( &((*T)->lChild) );
|
|
||||||
printf("创建右子树:\n");
|
|
||||||
CreateBiTree( &((*T)->rChild) );
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
// BiTree CreateBiTree()
|
|
||||||
|
|
||||||
// 先序遍历方式创建二叉树
|
|
||||||
BiTree CreateBiTree(){
|
|
||||||
|
|
||||||
char c;
|
|
||||||
BiTNode *tree;
|
|
||||||
|
|
||||||
// 过滤回车键
|
|
||||||
|
|
||||||
|
|
||||||
scanf("%c",&c);
|
|
||||||
if (c==' ')
|
|
||||||
{
|
|
||||||
printf("创建空节点\n");
|
|
||||||
tree = NULL;
|
|
||||||
}else{
|
|
||||||
printf("创建节点 %c\n",c);
|
|
||||||
tree = (BiTNode *)malloc(sizeof(BiTNode));
|
|
||||||
tree->item = c;
|
|
||||||
tree->lChild = CreateBiTree();
|
|
||||||
tree->rChild = CreateBiTree();
|
|
||||||
}
|
|
||||||
|
|
||||||
return tree;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int PreOrderTraverse(BiTree T){
|
|
||||||
|
|
||||||
if(T){
|
|
||||||
printf("%c\n",T->item );
|
|
||||||
PreOrderTraverse(T->lChild);
|
|
||||||
PreOrderTraverse(T->rChild);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int InOrderTraverse(BiTree T){
|
|
||||||
|
|
||||||
if (T)
|
|
||||||
{
|
|
||||||
InOrderTraverse(T->lChild);
|
|
||||||
printf("%c\n", T->item);
|
|
||||||
InOrderTraverse(T->rChild);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int PostOrderTraverse(BiTree T){
|
|
||||||
|
|
||||||
if (T)
|
|
||||||
{
|
|
||||||
PostOrderTraverse(T->lChild);
|
|
||||||
PostOrderTraverse(T->rChild);
|
|
||||||
printf("%c\n",T->item );
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 广度优先遍历 (队列实现)
|
|
||||||
int LevelOrderTraverse(BiTree T){
|
|
||||||
|
|
||||||
if (T)
|
|
||||||
{
|
|
||||||
Queue queue;
|
|
||||||
initQueue(&queue);
|
|
||||||
|
|
||||||
BiTree u;
|
|
||||||
u=(BiTree)malloc(sizeof(BiTNode));
|
|
||||||
enQueue(&queue, T);
|
|
||||||
while(!isEmpty(&queue))
|
|
||||||
{
|
|
||||||
deQueue(&queue, &u);
|
|
||||||
printf("%c",u->item);
|
|
||||||
if(u->lChild)
|
|
||||||
enQueue(&queue, u->lChild);
|
|
||||||
if(u->rChild)
|
|
||||||
enQueue(&queue, u->rChild);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char const *argv[])
|
|
||||||
{
|
|
||||||
/* code */
|
|
||||||
BiTree binaryTree;
|
|
||||||
|
|
||||||
printf("创建二叉树,输入\"空格\"创建空节点(先序方式建立二叉树):\n");
|
|
||||||
binaryTree = CreateBiTree();
|
|
||||||
if(binaryTree==NULL){
|
|
||||||
printf("创建空的二叉树\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
printf("前序遍历:\n");
|
|
||||||
PreOrderTraverse(binaryTree);
|
|
||||||
printf("\n\n");
|
|
||||||
|
|
||||||
printf("中序遍历:\n");
|
|
||||||
InOrderTraverse(binaryTree);
|
|
||||||
printf("\n\n");
|
|
||||||
|
|
||||||
printf("后序遍历:\n");
|
|
||||||
PostOrderTraverse(binaryTree);
|
|
||||||
printf("\n\n");
|
|
||||||
|
|
||||||
printf("层序遍历:\n");
|
|
||||||
LevelOrderTraverse(binaryTree);
|
|
||||||
printf("\n\n");
|
|
||||||
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Binary file not shown.
@@ -1,34 +0,0 @@
|
|||||||
//
|
|
||||||
// public.h
|
|
||||||
// DS
|
|
||||||
//
|
|
||||||
// Created by mac on 13-9-8.
|
|
||||||
// Copyright (c) 2013年 xiaoran. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef DS_public_h
|
|
||||||
#define DS_public_h
|
|
||||||
|
|
||||||
//#include <malloc.h>
|
|
||||||
#include "stdlib.h" // 后来,换到mac环境下,#include <malloc.h> 应该为<malloc/malloc.h> 或 #include "stdlib.h"
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h> // for memset
|
|
||||||
|
|
||||||
|
|
||||||
typedef char ElemType ; // 也可能是一个复杂的复合类型
|
|
||||||
typedef int Status;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define OK 1
|
|
||||||
#define ERROR 0
|
|
||||||
|
|
||||||
typedef int bool;
|
|
||||||
#define YES 1
|
|
||||||
#define NO 0
|
|
||||||
|
|
||||||
#define DEFAULT_SIZE 10
|
|
||||||
#define OUT_OF_BOUND -1
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,175 +0,0 @@
|
|||||||
//
|
|
||||||
// 队列.h
|
|
||||||
// 只在一段进行插入,另一端删除元素
|
|
||||||
//
|
|
||||||
// Created by mac on 13-9-8.
|
|
||||||
// Copyright (c) 2013年 xiaoran. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef DS____h
|
|
||||||
#define DS____h
|
|
||||||
|
|
||||||
#include "public.h"
|
|
||||||
#include "bintree.c"
|
|
||||||
|
|
||||||
typedef BiTNode ElemType;
|
|
||||||
|
|
||||||
//队列的顺序存储
|
|
||||||
typedef struct Node{
|
|
||||||
|
|
||||||
ElemType *elem;
|
|
||||||
ElemType *head;
|
|
||||||
ElemType *tail;
|
|
||||||
int length; // 当前队列的长度
|
|
||||||
int size; // 队列容器的长度,在队列慢得时候可以扩容
|
|
||||||
|
|
||||||
|
|
||||||
}SqQueue;
|
|
||||||
|
|
||||||
//
|
|
||||||
// 在队列采用顺序存储时,有一个毛病,就是队列操作一段时间后,头指针到了队列容器的尾部,而头指针前面的容器内存不可用了,
|
|
||||||
//造成内存极大的浪费,这个问题可以通过循环队列来解决。但是在
|
|
||||||
// 链式队列上则不存在这样的问题
|
|
||||||
//
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct QNode{
|
|
||||||
|
|
||||||
struct QNode *next;
|
|
||||||
ElemType elem;
|
|
||||||
|
|
||||||
}LinkQueue;
|
|
||||||
|
|
||||||
|
|
||||||
// 队列需要维护两个 指针 (队头指针,队尾指针)
|
|
||||||
|
|
||||||
typedef struct{
|
|
||||||
|
|
||||||
LinkQueue *head;
|
|
||||||
LinkQueue *tail;
|
|
||||||
int length;
|
|
||||||
|
|
||||||
}Queue;
|
|
||||||
|
|
||||||
|
|
||||||
Status initQueue(Queue *queue);// 带头结点,没有引用传值,就用指针的指针吧
|
|
||||||
bool isEmpty(Queue *q);
|
|
||||||
int length(Queue *q);
|
|
||||||
|
|
||||||
|
|
||||||
// 在头部插入,尾部删除
|
|
||||||
Status getHead(Queue *q,ElemType *e);
|
|
||||||
Status enQueue(Queue *q,ElemType e);
|
|
||||||
Status deQueue(Queue *q,ElemType *e);
|
|
||||||
|
|
||||||
void traveser(Queue *q);
|
|
||||||
|
|
||||||
|
|
||||||
Status initQueue(Queue *queue){// 带头结点,没有引用传值,就用指针的指针吧
|
|
||||||
|
|
||||||
LinkQueue *lq = (LinkQueue *)malloc(sizeof(LinkQueue));
|
|
||||||
if (!lq) {
|
|
||||||
return ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
lq->elem = 0;
|
|
||||||
lq->next = NULL;
|
|
||||||
|
|
||||||
(queue)->head = (queue)->tail = lq; // -> 优先级高于 * ,老老实实打上括号
|
|
||||||
(queue)->length = 0;
|
|
||||||
|
|
||||||
return OK;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isEmpty(Queue *q){
|
|
||||||
|
|
||||||
return (q->head == q->tail);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
int length(Queue *q){
|
|
||||||
|
|
||||||
// int ret;
|
|
||||||
// LinkQueue *p = q->head;
|
|
||||||
// while (p != q->tail) {
|
|
||||||
// ret++;
|
|
||||||
// p = p->next;
|
|
||||||
//
|
|
||||||
// }
|
|
||||||
|
|
||||||
return q->length;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
Status getHead(Queue *q,ElemType *e){
|
|
||||||
|
|
||||||
LinkQueue *p = q->head->next;
|
|
||||||
if (!p) {
|
|
||||||
*e=0;
|
|
||||||
return ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
*e = p->elem;
|
|
||||||
return OK;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// 入队(加入到队尾)
|
|
||||||
Status enQueue(Queue *q,ElemType e){
|
|
||||||
|
|
||||||
LinkQueue *newNode = (LinkQueue *)malloc(sizeof(LinkQueue));
|
|
||||||
if (!newNode) {
|
|
||||||
return ERROR;
|
|
||||||
}
|
|
||||||
newNode->elem = e;
|
|
||||||
newNode->next = NULL;
|
|
||||||
q->tail->next = newNode;
|
|
||||||
q->tail = newNode;
|
|
||||||
|
|
||||||
q->length++;
|
|
||||||
|
|
||||||
return OK;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//出队(队头). 注意,可能只有1个元素,造成队尾指针丢失
|
|
||||||
Status deQueue(Queue *q,ElemType *e){
|
|
||||||
|
|
||||||
LinkQueue *p = q->head->next;
|
|
||||||
if (!p) {// 队列空
|
|
||||||
return ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (e) {
|
|
||||||
*e = p->elem ;
|
|
||||||
}
|
|
||||||
|
|
||||||
LinkQueue *temp = p->next;
|
|
||||||
q->head->next = temp;
|
|
||||||
if (p == q->tail) {
|
|
||||||
q->tail = q->head;
|
|
||||||
}
|
|
||||||
free(p);
|
|
||||||
|
|
||||||
|
|
||||||
q->length--;
|
|
||||||
|
|
||||||
return OK;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void traveser(Queue *q){
|
|
||||||
|
|
||||||
LinkQueue *p = q->head->next;
|
|
||||||
while (NULL != p) {
|
|
||||||
printf("%d\n",p->elem);
|
|
||||||
p=p->next;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
/*
|
|
||||||
### 红黑树基础
|
|
||||||
|
|
||||||
一种自平衡的二叉查找树。在每个节点中增加一个存储位表示节点的颜色,可以是red或black
|
|
||||||
|
|
||||||
红黑树比AVL树优秀在哪?
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
5个性质
|
|
||||||
|
|
||||||
性质1. 节点是红色或黑色。
|
|
||||||
性质2. 根是黑色。
|
|
||||||
性质3. 所有叶子都是黑色(叶子是NIL节点)。
|
|
||||||
性质4. 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
|
|
||||||
性质5. 从任一节点到其每个叶子的所有简单路径 都包含相同数目的黑色节点。
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### 红黑树应用
|
|
||||||
|
|
||||||
|
|
||||||
### 存储结构
|
|
||||||
|
|
||||||
|
|
||||||
### 问题与延伸阅读
|
|
||||||
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef int ElemType
|
|
||||||
|
|
||||||
typedef struct node{
|
|
||||||
|
|
||||||
int color;
|
|
||||||
ElemType key;
|
|
||||||
struct node *lChild,*rChild,*pChild;
|
|
||||||
|
|
||||||
}*RBTree;
|
|
||||||
|
|
||||||
|
|
||||||
int rbtree_insert(RBTree *tree,ElemType key);
|
|
||||||
int rbtree_remove(RBTree *tree,ElemType key);
|
|
||||||
int rbtree_search(RBTree *tree,ElemType key);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
/*
|
|
||||||
|
|
||||||
### 后缀树(suffix tree)基础
|
|
||||||
|
|
||||||
又叫后缀trie,与trie最大不同在于:字符串集合由指定的后缀子串组成。
|
|
||||||
|
|
||||||
|
|
||||||
很适合用来操作字符串的子串。 用于字符串的匹配和查询
|
|
||||||
|
|
||||||
|
|
||||||
### 后缀树应用
|
|
||||||
|
|
||||||
|
|
||||||
从目标串T中判断是否包含模式串P(时间复杂度接近KMP算法);
|
|
||||||
从目标串T中查找最长的重复子串;
|
|
||||||
从目标串T1和T2中查找最长公共子串;
|
|
||||||
Ziv-Lampel无损压缩算法;
|
|
||||||
从目标串T中查找最长的回文子串;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### 存储结构
|
|
||||||
|
|
||||||
|
|
||||||
### suffix tree 问题与延伸阅读
|
|
||||||
|
|
||||||
后缀数组
|
|
||||||
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user