高手给点建议,如果将电子词典应用的代码优化或者有什么好的算法

时间:2023-02-11 19:24:06
最近自己写了一个电子词典的应用,由于是自己写应用练手,所以没有专门的词库,自己将一些单词用txt保存,然后从中查找

现在应用的查找功能已经实现,但存在一个问题,就是应用刚启动的时候,将单词load到ram中的时候消耗的时间较长,如何优化

设计思路如下,大牛们看看有哪里能改进:
1.定义链表,从文件中将每个单词load到ram中,(如果直接从文件查找,单词多了查询每个单词都很慢,所以先将单词存到buffer中),如果单词稍多,现在有6000个,这个load的过程耗时较长
2.将输入的单词与ram中的单词进行查找匹配,再根据查到单词对应的文件中的位置找出相应的解释,查找的过程有优化,很快

所以现在最大的问题是单词多了,全部load占有的buffer空间较大,耗时较多.有没有做过类似应用的,给点建议啊~~

9 个解决方案

#1


6000个不多吧, 咋会慢啊 ...

#2


如果只是简单的load6000个单词那应该不是很满,因为是保存在文件里面,load的时候先要计算每个单词和解释的长度,读出来,然后再memcpy到ram中,所以可能就耗时较多了

#3


看来是你的文件格式问题很大...

#4


之前有关注输入法查找的,感觉输入法里面有个搜索引擎,那个应该没有将整个字库存到buf中,而是用搜索引擎直接从字库中匹配.所以最好你能找一个专业词库,类似字库,里面实现了引擎.直接通过引擎去查找,这样效率高,而且占内存也不多.引擎怎么实现就不太清楚了

#5


保存单词的文件只是简单的奇数行是单词,偶数行是解释.
本来觉得应该用一个表来保存,这样查找起来也能比较快,关键做表太费时间了,所以只能用链表在ram中建了个表.
有没有什么好方案啊?

#6


我觉得4楼说的词库估计也就是一个大表,单词在一列,查找到单词后再根据主键去匹配解释.这样做应该能比较快,也不用load到ram中,关键建这个表费时间啊.

#7


字符串索引的一个常用数据结构是TRIE树,就是设计一个每个节点有26个children的树,每个树对应一个英文字母,这样,查找任意一个单词所需的时间之和只与这个单词的长度相关,时间复杂度为O(1)(查找长度为9的单词需要9步)

举例,对于一下3个词at, bye, buy结构如下
         <root>
          |
        |   |
        a   b
        |   |
      |   |    |
      t   u    y
          |    |
          y    e

#8


置于存储,可以直接将这个数据结构序列化到文件当中去,然后一口气load进来就可以了。

如果,单词太多(比如10万以上),可以想一些,在内存和硬盘间进行置换的方法

#9


了解了其它的一些做电子词典的确实需要词库和引擎来实现

多谢楼上的几位大虾给的建议

#1


6000个不多吧, 咋会慢啊 ...

#2


如果只是简单的load6000个单词那应该不是很满,因为是保存在文件里面,load的时候先要计算每个单词和解释的长度,读出来,然后再memcpy到ram中,所以可能就耗时较多了

#3


看来是你的文件格式问题很大...

#4


之前有关注输入法查找的,感觉输入法里面有个搜索引擎,那个应该没有将整个字库存到buf中,而是用搜索引擎直接从字库中匹配.所以最好你能找一个专业词库,类似字库,里面实现了引擎.直接通过引擎去查找,这样效率高,而且占内存也不多.引擎怎么实现就不太清楚了

#5


保存单词的文件只是简单的奇数行是单词,偶数行是解释.
本来觉得应该用一个表来保存,这样查找起来也能比较快,关键做表太费时间了,所以只能用链表在ram中建了个表.
有没有什么好方案啊?

#6


我觉得4楼说的词库估计也就是一个大表,单词在一列,查找到单词后再根据主键去匹配解释.这样做应该能比较快,也不用load到ram中,关键建这个表费时间啊.

#7


字符串索引的一个常用数据结构是TRIE树,就是设计一个每个节点有26个children的树,每个树对应一个英文字母,这样,查找任意一个单词所需的时间之和只与这个单词的长度相关,时间复杂度为O(1)(查找长度为9的单词需要9步)

举例,对于一下3个词at, bye, buy结构如下
         <root>
          |
        |   |
        a   b
        |   |
      |   |    |
      t   u    y
          |    |
          y    e

#8


置于存储,可以直接将这个数据结构序列化到文件当中去,然后一口气load进来就可以了。

如果,单词太多(比如10万以上),可以想一些,在内存和硬盘间进行置换的方法

#9


了解了其它的一些做电子词典的确实需要词库和引擎来实现

多谢楼上的几位大虾给的建议