32
Edlin 关关关关关关

Edlin 关键算法设计

  • Upload
    adia

  • View
    127

  • Download
    0

Embed Size (px)

DESCRIPTION

Edlin 关键算法设计. 主要内容. 编辑器在内存中的处理 编辑器在文件交换中的处理. Edline 在内存里的处理情况. 在内存中,采用行指针指向块节点的方式处理 系统最大可支持 512 行的处理容量 存储块采用动态申请方式得到. 存储块的管理. struct Block { char area[512]; char *rear; int charcount; int linecount; };. 存储块状态. Blockpointer[0]->area. Linepointer[0] Linepointer[1] - PowerPoint PPT Presentation

Citation preview

Page 1: Edlin 关键算法设计

Edlin 关键算法设计

Page 2: Edlin 关键算法设计

主要内容

编辑器在内存中的处理 编辑器在文件交换中的处理

Page 3: Edlin 关键算法设计

Edline 在内存里的处理情况

在内存中,采用行指针指向块节点的方式处理

系统最大可支持 512 行的处理容量 存储块采用动态申请方式得到

Page 4: Edlin 关键算法设计

struct Block

{ char area[512];

char *rear;

int charcount;

int linecount;

};

存储块的管理

Page 5: Edlin 关键算法设计

A B C D \n E F G

H L P Q R S \n T

H I S I S A B O

O K \n W H A T I

S T H I S \n \0

Linepointer[0]

Linepointer[1]

Linepointer[2]

Linepointer[3]

存储块状态

Blockpointer[0]->rear

Blockpointer[0]->area

Blockpointer[0]->charcount Blockpointer[0]->linecount

Page 6: Edlin 关键算法设计

A B C D \n E F G

H L P Q R S \n T

H I S I S A B O

O K \n W H A T I

S T H I S \n L I

N E W \n \0

Linepointer[0]

Linepointer[1]

Linepointer[2]

Linepointer[3]

存储块状态Blockpointer[0]->area

Linepointer[4]

Blockpointer[0]->rear

Blockpointer[0]->charcount+= 串长 linecount+=1

Page 7: Edlin 关键算法设计

内存中的关键算法

行插入算法 函数 Insertline(char *,long) 行删除算法 函数 DeleteLine(long) 内存优化算法 函数 Optimize ()

Page 8: Edlin 关键算法设计

插入算法的原则1 、新插入的内容总是在相应的存储块中紧密排列。2 、在存储块中有关于剩余字符空间的纪录 , 在插入时 , 依次判

断相应的存储块中所剩余的字符空间是否足够 , 当足够时就进行插入。

3 、如果用户所输入的字符串大于 127 (不含行结束符),系统将自动进行截断,分行插入

4 、当所有已存在的存储块都已存满,则在内存中开辟一个新块,并且格式化。将内容写进新块中。

Page 9: Edlin 关键算法设计

插入内容在内存中的维护属性数组

0 3 1002 1004 1001 2011 2008 ……

编号规则属性数字 = 块号 *1000+ 实际行号属性信息获取方法

属性数字 /1000== 块号

属性数字 %1000== 实际行号

Page 10: Edlin 关键算法设计

插入算法

0 3 1002 1004 1001 2011 2008 …

0 3 1002 1004 1001 1012 2011 2008 …

行插入前

行插入后

标志着该行的信息已经插入到第二个存储块中,并且该行在内存中的行号是第 12 行。

Page 11: Edlin 关键算法设计

A B \n C D E

F \n G H I J

K L I \n

O P Q \n R S

T U \n 1 2 3

4 5 \n

V W X Y Z \n

A B C D E \n

F G \n

0

1

2

Lp[0]

Lp[1]

Lp[2]

Lp[3]

Lp[4]

Lp[5]

Lp[6]

Lp[7]

Lp[8]

插入 1 行后,内存的情况

Page 12: Edlin 关键算法设计

4 0 1 1003 1002 2005 2006 2007 …

插入前

插入后4 0 1 1003 1002 1008 2005 2006 2007

插入时,系统自动寻找空间足够的存储块,并且将插入的内容写存储块中。同时改变属性数组的内容,以维护整个系统中行的顺序以及为下一次插入做准备。

插入算法

Page 13: Edlin 关键算法设计

删除算法的原则

一、删除算法包括三部分修改 1 、行指针的移动 2 、块中实际内容的删除 3 、属性数组的修改二、删除算法结束后,保持块中存储 内容的紧密性三、如果某个存储块中的内容被删空 则将该存储块释放以获得内存空间

Page 14: Edlin 关键算法设计

A B \n C D E

F \n G H I J

K L I \n

O P Q \n R S

T U \n 1 2 3

4 5 \n

V W X Y Z \n

A B C D E \n

F G \n

0

1

2

Lp[0]

Lp[1]

Lp[2]

Lp[3]

Lp[4]

Lp[5]

Lp[6]

Lp[7]

Lp[8]

红色部分为待删除的行

Page 15: Edlin 关键算法设计

A B \n C D E

F \n G H I J

K L I \n

O P Q \n 1 2

3 4 5 \n

V W X Y Z \n

A B C D E \n

F G \n

0

1

2

Lp[0]

Lp[1]

Lp[2]

Lp[2]

Lp[3]

Lp[4]

Lp[5]

Lp[6]

Lp[7]

红色部分为待删除的行

Page 16: Edlin 关键算法设计

3 0 1 1002 1007 2004 2005 2006 …

删除前

删除后

4 0 1 1003 1002 1008 2005 2006 2007

插入时,系统自动寻找空间足够的存储块,并且将插入的内容写存储块中。同时改变属性数组的内容,以维护整个系统中行的顺序以及为下一次插入做准备。

删除算法

Page 17: Edlin 关键算法设计

内存优化算法 目的 由于频繁的插入和删除操作,在内存中可能

产生较大的空闲。此时,对内存进行优化。 条件 当某个存储块中的字符数不足块容量的 %4

0 时进行优化。 方法 内存的优化基于插入和删除操作,根据属性

数组找到该块中还剩余的行,取得该行的内容并将其删除,然后间该行的内容插入文本。

Page 18: Edlin 关键算法设计

A B \n C D E

F \n G H I J

K \n

O P Q \n R S

T \n

V W X Y Z \n

A B C D E \n

F \n

1

2

0

Page 19: Edlin 关键算法设计

A B \n C D E

F \n G H I J

K \n O P Q \n

V W X Y Z \n

A B C D E \n

F \n R S T \n

1

2

0

释放

Page 20: Edlin 关键算法设计

文件交换算法 引入目的 在对文件进行处理时,当行数超过

512 行时,需要引入一种机制,将文件中的制定部分调入内存。

方法 文件交换部分由内存块和两个临时

文件组成。调入的内容存放在内存块中,暂时不用的内容放在两个临时文件中。

Page 21: Edlin 关键算法设计

文件交换的实现

顺序控制数组

int checkfile[2]

存储区域标记数组

long signfile[2][3]

两个文件指针

File *current[2]

Page 22: Edlin 关键算法设计

关于三个数组Checkfile[3]

数组中存有三个数字 0 , 1 , 2 ,我们约定 0 表示内存区域, 1 表示临时文件一, 2 表示临时文件二。

三个数字的不同排列组合表示真正的源文件在内存中和临时文件中的存储顺序

在引入文件是按照顺序数组中的顺序进行引入。

例如、如果 checkfile[0]=1 checkfile[1]=0

checkfile[2]=2

那么 文件的引入顺序就是临时文件一、内存和临时文件二

Page 23: Edlin 关键算法设计

关于三个数组Signfile[3][2]

Signfile[0][0] 内存中的一行的物理行号

Signfile[0][1] 内存中存储的行数

Signfile[1][0] 临时文件一中的第一行的物理行号

Signfile[1][1] 临时文件一中存储的行数

Signfile[2][0] 临时文件二中的第一行的物理行号

Signfile[2][1] 临时文件二中存储的行数

Page 24: Edlin 关键算法设计

关于三个数组Currentfp[2]

Currentfp[0] 指向临时文件一的结尾

Currentfp[1] 指向临时文件二的结尾

引入这三个数组可以在文件交换中保证文件的顺序的正确性和稳定性

下面介绍文件交换的过程

Page 25: Edlin 关键算法设计

文本状态

Checkfile[0]=1

Checkfile[1]=0

Checkfile[2]=2

Signfile[0][0]=701 Signfile[0][1]=200 Signfile[1][0]=1 Signfile[1][1]=700 Signfile[2][0]=901 Signfile[2][1]=300

M

E

M

O

R

Y

T

E

M

P

2

T

E

M

P

1

701

200

901

1

700

700

901

300

1200

0 1 2

Page 26: Edlin 关键算法设计

M

E

M

O

R

Y

T

E

M

P

2

T

E

M

P

1200

901

1

700

700

1001

300

1300

0 1 2

701

1001

在当用户进行编辑时,首先在内存中进行处理,如果所处理内容超过内存的处理能力,那么将内存中的内容写入临时文件,然后调入相应的内容进行处理。如果用户要求出里内存中不存在的部分,也根据用户的要求进行交换引入处理。

Page 27: Edlin 关键算法设计

假设此时用户要求处理第 300 行的内容

200

901

1

500

700

1001

300

1300

0 1

701

300

当用户要求处理第 200 行的内容时,系统准备将第 200 行至第 400 行的内容调入内存区域,即图中所时的蓝色部分

Page 28: Edlin 关键算法设计

文件交换处理

在处理时,系统首先内存部分的内容追加到临时文件一中,然后清空内存中的纪录

M

E

N

O

R

Y

T

E

M

P

2

Temp1

Page 29: Edlin 关键算法设计

文件交换处理

系统然后将临时文件二中的内容追加到临时文件一的最后,然后清空临时文件二中的纪录

此时,临时文件一中存有整个文件的信息

M

E

N

O

R

Y

T

E

M

P

2

Temp1

Page 30: Edlin 关键算法设计

文件交换处理

系统然后将临时文件一中的前 300 行的内容写到临时文件二中,然后删除临时文件一中前 300 行的纪录

M

E

N

O

R

Y

T

E

M

P

2

Temp1

Page 31: Edlin 关键算法设计

文件交换处理

系统然后将临时文件一中的前 200 行的内容写到内存中,然后删除临时文件一中前 200 行的纪录

交换结束

M

E

N

O

R

Y

T

E

M

P

2

Temp1

Page 32: Edlin 关键算法设计

下一步 总结对听众的要求 总结您要进行的工作