马尔科夫链Word格式.docx
《马尔科夫链Word格式.docx》由会员分享,可在线阅读,更多相关《马尔科夫链Word格式.docx(14页珍藏版)》请在冰豆网上搜索。
③马尔科夫链在环境预测中的应用
鉴于目前环境质量预测在理论方法和实践上的缺乏,把马尔科夫链引入环境质量的预测中,将各种污染物的浓度变化过程视作马尔科夫过程,通过预测各种污染物的污染负荷系数来推知其浓度值/
④马尔科夫链在桥梁状态预测中的研究与应用
马尔科夫链以矩阵的形式来表达桥梁状况,通过求解状态转移矩阵,进一步预测桥梁未来数年内的基本状况。
综合考虑了桥梁检修的影响,给出了桥梁检修后不同状态的状态转移矩阵,为进一步引入实际数据做了充分的准备。
3、相关文献
《程序设计实践》作者 BrianW.Kernighan
程序设计实践并不是只是写代码。
程序员必须评价各种折中方案,在许多可能性之中做出选择,排除错误,做测试和改进程序性能,还要维护自己和其他人写的软件。
在满足规范的同时还必须关注许多问题,包括兼容性,坚固性和可靠性等等。
该书从排错,测试,性能,可移植性,设计,界面,风格和记法等方面,讨论了程序设计中的实际的同时又是非常深刻和具有广泛意义的思想,技术和方法。
本书值得每个梦想并努力成为优秀程序员的人参考,值得每个计算机专业的学生和IT从业者阅读,也可作为程序设计高级课程的教材或参考书。
其他书籍:
MatthewAustern的《类属程序设计与STL》(GenericProgrammingandtheSTL,Addison-Wesley,1998)
对C++语言本身的参考文献当
然是BjarneStroustrup的《C++程序设计语言》(C++ProgrammingLanguage第3版,Addison-Wesley,1997),LarryWall、TomChristiansen和RandalSchwartz的《Perl程序设计》(ProgrammingPerl第2版,O’Reilly,1996)等等。
4、国内外现状
自我国数学家教育家中科院王梓坤院士在上世纪中期将马尔科夫链引进入我国后,取得了很大的成就,尤其是在天气短期预测方面。
二、哈希表介绍
一般的线性表、树中,记录在结构中的相对位置是随机的即和记录的关键字之间不存在确定的关系,在结构中查找记录时需进行一系列和关键字的比较。
这一类查找方法建立在“比较”的基础上,查找的效率与比较次数密切相关。
理想的情况是能直接找到需要的记录,因此必须在记录的存储位置和它的关键字之间建立一确定的对应关系f,使每个关键字和结构中一个唯一的存储位置相对应。
因而查找时,只需根据这个对应关系f找到给定值K的像f(K)。
若结构中存在关键字和K相等的记录,则必定在f(K)的存储位置上,由此不需要进行比较便可直接取得所查记录。
在此,称这个对应关系f为哈希函数,按这个思想建立的表为哈希表(又称为杂凑法或散列表)。
三﹑编写的C程序
⒈总体思路
解决马尔科夫链的思维,马尔科夫链是根据不同的前缀,随机选择后缀,从而生成句子,我们可以单独储存文章中的每个词,每个词后跟一个链表,当查询到这个词的时候,也能查询到与它关联的链表,从而从与它相关的链表中随机选取一个词输出,我们可以做一种哈希表,让前缀做关键字,它的值是与前缀相关联的所有词的集合。
定义一个数据结构,由一个前缀和一个后缀链表组成。
所有这些信息存在一个散列表里,前缀是关键码。
每个前缀由两个组成。
如果一个后缀在给定前缀下的出现
多于一次,则每个出现都单独包含在有关链表里。
⒉程序分析:
⑴程序开始,用的是宏定义和枚举类型,用typedef声明新类型State和Suffix,把每个词储存成独立的字符串。
⑵hash函数对数组里所有字符串的拼接做散列,lookup向
s
p
-
>
r
e
f
[
]里存入一个指针。
利用
i
n
t
f动态地建立格式串用来维护缓冲区导出的两个常数之间的关系。
⑶函数b
u
l
d有两个参数,一个是p
x数组,用来保存前面的所有的输入词;
一个是个F
I
L
E指针。
函数把p
x和读入词的一个拷贝送给a
d
d,该函数在散列表里加入一个新项,并更新前缀数组:
对m
m
o
v
e的调用是在数组里做删除。
这个操作把前缀数组里从
1到N
P
R
E
F
1的元素向下搬,移到从0到N
2的位置。
这也就删去了第一个前缀词,并为新来的一个在后面腾出了位置。
函数a
x把一个新后缀加进去,
a
d完成给有关前缀加入一个后缀的一般性工作,a
x做的是把一个词具体地加进后缀链表里。
函数
d由b
d调用,而a
x只在a
d内部使用这就完成了输入。
⑷对于输出,如果输出非常长,我们可以在产生了一定数目的词之后终止程序;
另一种情况是程序遇
到了后缀N
O
N
W
D。
最终看哪个情况先出现。
函数g
e产生每行一个词的输出,用文字处理程序可以把它们汇成长的行。
⑸把所有东西放到一起,装进一个
n函数里,它从标准输入流读入,生成至多有指定个数的词序列。
⑹程序结束。
⒊其他应用的知识:
下程序还用到了链表,结构体以及处理动态链表的函数,特作说明。
malloc函数
其作用是在内存的动态存储区中分配一个长度size的连续空间。
此函数的值(“即返回值”)是一个指向分配域其实地址的指针(类型为void)。
如果此函数未能成功地执行,则返回空指针。
结构体:
C语言允许用户自己指定这样一种结构,它相当于高级语言中的“记录”,struct用来声明结构体类型时所必须用到的关键字,它向编译系统声明这是一个“结构体类型”。
⒋程序源代码
#include<
stdio.h>
个
stdlib.h>
string.h>
time.h>
malloc.h>
enum
{
NPREF=2,
/*
前缀中词的个数*/
NHASH=4093,
/*散列表数组的大小*/
MAXGEN=10000,
/*生成词数的上届*/
MULTIPLIER=31
};
charNONWORD[]="
"
;
typedefstructStateState;
/*定义新类型State*/
typedefstructSuffixSuffix;
/*定义新类型Suffix*/
structState{/*前缀和后缀表*/
char*pref[NPREF];
/*前缀单词*/
Suffix*suf;
/*后缀表*/
State*next;
structSuffix{/*后缀表*/
char
*word;
/*后缀单词*/
Suffix*next;
State*statetab[NHASH];
unsignedinthash(char*s[NPREF])/*hash函数对数组里所有字符串的拼接做散列*/
unsignedinth;
unsignedchar*p;
inti;
h=0;
for(i=0;
i<
NPREF;
i++)
{
for(p=(unsignedchar*)s[i];
*p!
='
\0'
p++)
h=MULTIPLIER*h+*p;
}
returnh%NHASH;
}
State*lookup(char*prefix[NPREF],intcreate)/*lookup函数向
*/
inti,h;
State*sp;
h=hash(prefix);
for(sp=statetab[h];
sp!
=NULL;
sp=sp->
next)
if(strcmp(prefix[i],sp->
pref[i])!
=0)
break;
if(NPREF==i)
returnsp;
if(create)
sp=(State*)malloc(sizeof(State));
if(NULL==sp)
perror("
Memorynotenough:
);
return0;
sp->
pref[i]=prefix[i];
suf=NULL;
next=statetab[h];
statetab[h]=sp;
voidaddsuffix(State*sp,char*suffix)/*函数a
x把一个新后缀加进去*/
suf=(Suffix*)malloc(sizeof(Suffix));
suf->
wo