IL遇到的思路及问题   http://chenjianqi1989.blog.163.com/blog/static/2185202032015083425325/

1.     首先将论文看懂,看论文时并没有太大的困难,倒是感觉论文中的内容很简单,后来做完IL后才领悟到,IL本身的算法并不难,难的是如何将思想转化为程序。

2.     论文看懂后,拿到了倒排表,看不懂的是:这是什么意思?

3.

编号方法:

D 为例:

第一个3:是编号的长度

最后一个3:是前序优先遍历的顺序

中间是其父节点的编号。

4.看懂了倒排表后,接下来就是考虑怎么将关键字取出,怎么将该关键字的个数取出,怎么将结点的编号取出。选择怎样的数据结构的问题。

我采用的是CMap数据结构,具体是

CMap <CString,LPCTSTR,CArray<int *,int *>*,CArray<int *,int *>*> MyCMap;//数据结构

5.接下来,就开始研究这个数据结构的意义了,CMap使用方法相当于JAVA中的HashMap,即是一个KEY-Value的存储结构。

※C++中CMap的底层实现:

CMap是一种Hash Map,Hash Map要求每个元素都要有一个Hash值——一个关于KEY的函数,Hash Map用这个值作为Hash表的索引。如果有多个KEY的Hash值相同,它们将以链表的方式存储。

※JAVA中的HashMap与TreeMap的区别:在java 2集合框架中的Map接口有两个通用实现:HashMap和TreeMap. HashMap是采用哈希表实现,是Map接口的最好的全面实现.TreeMap实现了Map的子接口SortedMap,采用红黑树作为底层存储结构,提供了按照键排序的Map存储.

◆LPCTSTR 知识:http://baike.baidu.com/link?url=jOrAe1-jtJFg18K13VZklU4IIT8rwXeDYSO90mHfeHiIarU7i2nEpNMMAQhowiS6CTMypKW5XC3fSywWOz4fuK

主要是用于:1)用来表示你的字符是否使用UNICODE

2)用来进行类型转换,例:

CString 转LPCTSTR:

CString cStr;

const char *lpctStr=(LPCTSTR)cStr;

LPCTSTR转CString:

LPCTSTR lpctStr;

CString cStr=lpctStr;

6.弄懂了数据结构就开始学习CMap,CArray,CString的知识,见附件。主要弄懂CMap的存取,CArray的存取,CString的截取等操作。

// 以下是函数的总体介绍 /

■IL_main()

{

//对关键字的多少进行排序

//求slca(),调用的函数get_slca()

//释放空间

}

■get_slca()

{

//左右匹配

//调用lca(),求出最低共同祖先

//求子孙结点,调用descedant()

//条件1:判断结点大小

//条件2:判断是否是祖先结点。若满足以上两个条件,那么将结点加入到结果集中

//释放空间

}

■descedant()//返回子孙结点

{

}

■lca()//求最低共同祖先

{

}

■Lm()//左右匹配

{

}

///

7.学习完数据结构后,考虑怎么有效的进行取出的问题(问题4中提到的)。

以下是截取方式(可能不是最佳的):

1)          查找到’<’位置,‘:’位置,然后用CString类型截取出关键字。关键字取出后有冒号,需要过滤掉。注意Mid()函数的第二个参数是截取的个数。

2)          找到第二个‘:’,用Mid()截取出结点的个数。截断字符串。

3)          考虑使用二重循环来遍历所有。

第一层循环是使用getline()读取每行;第二层循环是依次读取读入的这行的数据。那么就是找’.’,这样可以依次取出编号的长度,以及编号。取出编号长度,以及编号后将其存储到int型的指针中。

知识点:

★String转化成int型函数  _ttoi()。

○最后一个数字即分号前的数,单独处理。

○当当前的结点编号结束后要加入到CArray中

★将string转换为CString,用 c_str()

注意:

写程序时遇到的粗心的问题:

◎使用while()自变量忘记自加

◎变量命名不规范(没有见名知意等),使得测试时花费了很多时间

◎什么时候该加入到CArray中,什么时候该加入到CMap中

◎小于和小于等于问题

◎由于逻辑问题导致每次取的个数都不一样,这个需要细心观察

◎存储的长度问题,考虑是否是需要加一

全部结束后,将CArray加入到CMap中去。

刚刚开始写读函数可能会遇到各种问题,当时在读函数上用了几天的时间。由于逻辑问题,易把问题想的太复杂了。

8.左右匹配问题(重点,时间主要花费在左右匹配上了)

注意1:在做左右匹配时一定要保证数据保存的正确性。因此需要测试一下。

左匹配:无论是左匹配还是右匹配都使用折半查找。因为折半查找的时间复杂度是 。

注意2:由于数据集中不同的关键字的结点的编号可能会相同。例如:text 和 tissue 同时含有7.1.2.3505.5383.5394.5407.5411。

这是因为XML中的标签和及其此标签中的文本会被抽象成为不同的关键字。例如:

<note>

<to>George</to>

<from>John</from>

<heading>Reminder</heading>

<body>Don't forget the meeting!</body>

</note>

灰色区域的form 与John的编号相同。

在左右匹配时,必须考虑左右匹配不存在的情况。

提示:刚刚开始写左右匹配时可能会想到把左右匹配写成一个函数,但是若发现这个有点困难,何不放一放,暂且将左右匹配写为两个函数,待实现左右匹配时再将左右匹配合为一个函数即可。

9.lca(v1,v2)即找最低共同祖先

若任意一个为空,则为空。

若都不为空,则返回最长共同前缀。

最长共同前缀的求法:根据参数(指针类型),循环访问,其数据是否相等,直到不相等,退出循环。从而得到其最长共同前缀。

写这个函数并没有什么难度。

注:在此注意的是长度的边界问题。

10. descedant(v1,v2)//返回子孙结点

若其中有一个为空则返回的是非空的参数。

若都不为空,返回的是v1,v2中的子孙结点。

子孙结点的判断方法:

观察子孙结点与其祖先结点,祖先结点的编号会完全在子孙结点中出现,这样以来,可以判断其长度即可,长度长的为子孙结点,长度短的是祖先结点。

可能会有此顾虑:参数v1,v2会不会出现不是祖先和子孙的关系?

这种情况是不会存在的,如图所示:

Ben 0.1.1.2.0(与自己写的编码不太一样,但道理一样)与John的左匹配是0.1.1.1.0,右匹配是0.1.2.0.0。在经过lca()后为0.1.1和0.1。结果肯定是祖孙关系。所以descedant(),传递的两个参数是确定的祖孙关系。

11.get_slca()找最小最低共同祖先

本函数就是调用前面的几个函数。

◎初始根结点u = 0,在实现时可以设为1.1。

◎判断u的编码是否是小于x的编码

◎判断u是否是x的祖先,若不是祖先则加入到Result中。

u = x是包含在if(pre(u) < pre(x))中的,伪代码有规定(可能是不成文)缩进对齐的是同一级别。即:

12.写一个调用get_slca()的函数即可。

//

优化阶段

首先优化的是左右匹配,可以考虑是否是用一个函数来完成左右匹配。

解决方法:使用了两个全局变量left,right,来记录的是左右匹配的位置,而不是使用指针;左匹配做完之后,右匹配的位置也就得到了。

这样可以通过位置来获得左右匹配。

1.     Lca(),descendant()

优化的方法:

将返回的最低共同祖先/子孙结点的编号改为使用结点类来存储。而结点类中包含了一个指针,指向的是子孙的编号;一个int型的变量存储的是编号的长度。

2.     get_slca()

优化方法:

将u的初始化的1.1改为了,第一次的求子孙的结果。减少了一步(将1.1做为祖先)。在此不做进一步的分析。当然u相应的改为了结点类型的,因为我们在加入Result中时使用的是指针型,因此在加入前设置一个指针,将结点存的值复制给指针。

将比较大小单独做一个函数进行判断,判断时所传递的参数是结点类型。且不允许修改其值。即:

int InStream::Compare(const Node &v, const Node &node)//比较大小

3.     在调用get_slca时的优化

因为少量的结点中找量大的结点的左右匹配的时间<将量大的与量小的结点中找左右匹配时所用的时间。所以可以考虑将比较的关键字的个数进行按升序排序。然后再调用get_slca()函数。使用的是直接插入排序。

4.     释放空间

刚刚写完xmark500时仅仅只能跑一遍,这就需要进行释放空间。

Carray->RemoveAll(),仅仅是将Carray中的空间进行释放,而空间中的指针没有被释放掉。因此将指针进行释放,这就需要使用双层循环将Carray进行释放干净。

相应的CMap也需要在析构函数中进行释放空间。

◆注意:释放空间时,需要将之前不再使用的空间进行释放,若下次还会使用,则需申请一个临时的空间暂存,使用完后,将临时空间释放即可。

5.此外还可以将结点类转换为结构体。如下:

struct Node

//class Node

{

//public:

//   Node(void);

//   ~Node(void);

//public:

int length;//长度

int *p;//指针

};

将cpp文件注释掉即可。

IL遇到的思路及问题相关推荐

  1. IL思路及遇到的问题、解决方法

    IL思路及遇到的问题.解决方法 前序: XML:可扩展标记语言,其标签是可自定义的.可以将XML用树模型表示,从而解决问题. HTML:是超文本标记语言,其标签是不可自定义的.   XML的例子: & ...

  2. 一种精确从文本中提取URL的思路及实现

    在今年三四月份,我接受了一个需求:从文本中提取URL.这样的需求,可能算是非常小众的需求了.大概只有QQ.飞信.阿里旺旺等之类的即时通讯软件存在这样的需求.在研究这个之前,我测试了这些软件这块功能,发 ...

  3. 剑指offer第二版答案详细版(带详细解题思路)

    1.滑动窗口的最大值(剑指offer原59题) 解题思路:其实是一个队列的问题,用一个队列去维护当前窗口中的所有元素:首先将超出窗口中的队头元素先删掉,然后将新的元素插入当前窗口中,插入时要判断新插入 ...

  4. 玩转动态编译 - 高级篇:一,IL访问静态属性和字段

    IL介绍 通用中间语言(Common Intermediate Language,简称CIL,发音为"sill"或"kill")是一种属于通用语言架构和.NET ...

  5. Leetcode 106. 从中序与后序遍历序列构造二叉树 解题思路及C++实现

    解题思路: 思路和Leetcode 105题相同.区别在于,在这一题中,后序遍历的最后一个值为根节点. 然后仍然是找到根节点后,划分左右子树,递归构建. /*** Definition for a b ...

  6. Leetcode 105. 从前序与中序遍历序列构造二叉树 解题思路及C++实现

    解题思路: 前序遍历preorder中,第一个即为根节点,然后找到中序遍历inorder中对应的节点,则inorder中该节点之前的值均在根节点的左子树上,该节点后面的值都在根节点的右子树上,所以可以 ...

  7. 干货|针对单个网站的渗透思路(精)

    本文很适合初学者及挖不到漏洞的小伙伴,提供一个很好的思路. 首先,当我们拿到一个网站的域名或者IP的时候. 最先要做的是信息收集. 下面着重介绍一下信息收集模块 一.信息收集--端口扫描与分析 1.得 ...

  8. 三菱st语言编程实例_LD、FBD、IL、ST、SFC、CFC六种编程语言的特点

    CODESYS共支持六中不同的编程语言,很多学者在学习的过程中常会问一个问题,哪种编程语言最好? 其实本人觉得没有哪种编程语言是绝对的好或不好,不同的工程应用具有不同的最佳编程方式,每种编程语言都具有 ...

  9. [你必须知道的.NET]第十四回:认识IL代码---从开始到现在

    本文将介绍以下内容: ·       IL代码分析方法 ·       IL命令解析 ·       .NET学习方法论 1. 引言 自从『你必须知道.NET』系列开篇以来,受到大家很多的关注和支持, ...

最新文章

  1. 19个决定性时刻,2030年前,这些黑科技必将发生
  2. 内核级HOOK的几种实现与应用
  3. 一张小票看透支付清结算架构
  4. 5. extjs 中buttonAlign什么意思
  5. FL2440的U-boot-2009.08移植(三)支持Nor FLASH
  6. jqGrid如何设置jqGrid第一次初始化时不加载任何数据?实现方法!
  7. 如何在 SAP 电商云里设置 Time Restrictions
  8. JavaScript 对象继承
  9. centOS restart xinetd
  10. 【转】正则表达式之基本概念
  11. 初学Codesmith,第一次写模板
  12. 并查集详解(C/C++)
  13. css表格文字超数量就竖排_CSS奇特技巧:控制文字竖排
  14. mysql select from user_select * from user 这条 SQL 语句,背后藏着哪些不可告人的秘密?...
  15. 【评测】MP SARS-CoV-2单抗、重组蛋白
  16. 接待员如何向客人upsell_前厅部接待员办理入住操作步骤
  17. 微信小程序——卡片列表显示listview(带阴影)
  18. 【力扣17】电话号码的字母组合
  19. JavaScript 之 核心语法 [ 对象 ]
  20. C#交错数组和多维数组

热门文章

  1. C语言文件读写(1)-文本文件读操作
  2. Redis—列表(List)、集合(Set)、哈希(Hash)、有序集合 Zset
  3. wordpress博客评论框添加背景图片
  4. 微信开发 -- 自定义菜单
  5. 明星粉丝经济“叫好不叫座”?变现需找准“窍门儿”
  6. git 设置本地用户名和邮箱。
  7. 茅台与小米搞饥饿营销?
  8. 计算机色彩再现原理,清华大学出版社-图书详情-《计算机色彩原理及应用》
  9. Git 命令行的各种退出方式
  10. vue文件流导出excel表格打不开