简单总结下几个算法

[QQ群: 189191838,对算法和C++感兴趣可以进来]

第一个问题,查找出1000万数据中最大的100万条。

对这个问题的第一反应就是利用排序算法,排序有很多种。其中以快排用的最多。只需多次paration得到前100万即可。

还有一种思路就是建立一个100万大小的堆,然后再不断的对进来的数据进行堆调整。当查找出的数据越小的时候,优势会特别明显。比如100万变成100的时候,用堆将是最好选择。

第二个问题,对最大数为1000万的100万条数据进行排序,且数据无重复。

这个其实也可以用堆排序,快速排序进行处理。但是还可以用位图的方式进行处理。位图的时间复杂度是N,快于他们,只不过需要开辟100万/8个字节而已。

如果把题目改成,999999(100万-1)条数据中是由1-100万组成,且无重复,查找出那个缺失的数据。用位图的优势将会越加体现。比其他排序方法好很多。

第三个问题,100万+1条数据中都是两两重复的,只有一条是单着的。

当然,我们可以用排序。但是用这些数据全部与&,会快很多。所以位操作有时候很重要。

第四个问题,查找一本书中是否存在某个单词。

这个问题,可以有很多种查找方式,比如说排序,通过基排序的方式,然后二分查找,这个很好,但是感觉效率还是不是很高。

或者用hash对书中所有单词进行hash,再比较。

我认为最好的方式是建立字典树tire,这个很快很快。

第五个问题,随机产生1--N中M个数。

如果可以产生重复的数,那么很简单,直接rand(N) m次即可。但是如果不可重复呢?

1,利用随机的思想,开一个N大的数组,然后for i=1...M;每次产生一个随机数k,如果k>i,交换数组中的数,否则不交换,重复M次。

2,利用概率的思想,第一个数在M个数里面的概率是m/N,则随机产生一个数k,(1...N)如果k小于m,则添加到m里面,同时m=m-1,对第二个数2,进行处理,此时2添加到数组中的概率应该是(m)/N-1....后面同理

本来不想粘贴代码,还是粘一下吧“

 1 public static void getM(int n,int m){//等概率的取出其中m个数
 2         for(int i=0;i<n;i++){
 3             Random random=new Random();
 4             int k=random.nextInt(10000);
 5
 6             if(m>0&&k%(n-i)<m){
 7                 System.out.print(":"+i+" ");
 8                 m--;
 9                 if (m==0) {
10                     break;
11                 }
12             }
13         }
14     }

第六个问题,对于两个字符串,如何得到其中相同的子串呢?(不是子序列)子序列可不连续,但是子串必须连续。

第一反应用动态规划的思想求解。(暴力法时间复杂度太高)

第二,可以通过建立后缀数组的方式求解,后缀数组,排序。比较,得到答案。复杂度要比动态规划好。只不过是空间换时间罢了。代码就不贴了。

第七个问题,一堆单词集合M,一个字符串S。求出S可以在M中找到多少个单词。比如M={good,thank, you,are,do},S="goodoayouk".能到找到的单词是good,do,you.三个。

可以暴力法,硬匹配;

一种比较好的方法应该是利用AC自动机搜索。这个挺好,快!

(本文只用作自己总结,故没有展开来说,相关细节可以搜索其他文章,排版也不是我的长项,所以大家将就吧。)

未完待续。。。

版权所有,欢迎转载,但是转载请注明出处:潇一

时间: 2024-12-06 14:08:12

简单总结下几个算法的相关文章

最简单的分形图像生成算法

本文将提供一段完整地生成一幅分形图像文件的C语言代码,并且极为简单.我相信这应该是最简单的分形图像生成算法.大部分的分形图像代码也都很短,但一有递归迭代就难以理解了.而这段代码则很好懂,并且其生成的图像会使人意想不到. #include <iostream> #include <cmath> #include <cstdlib> #define DIM 1000 void pixel_write(int,int); FILE *fp; int main() { fp =

iOS下使用SHA1WithRSA算法加签源码

首先了解一下几个相关概念,以方便后面遇到的问题的解决: RSA算法:1977年由Ron Rivest.Adi Shamirh和LenAdleman发明的,RSA就是取自他们三个人的名字.算法基于一个数论:将两个大素数相乘非常容易,但要对这个乘积的结果进行因式分解却非常困难,因此可以把乘积公开作为公钥.该算法能够抵抗目前已知的所有密码攻击.RSA算法是一种非对称算法,算法需要一对密钥,使用其中一个加密,需要使用另外一个才能解密.我们在进行RSA加密通讯时,就把公钥放在客户端,私钥留在服务器. PE

一种简单高效的音频降噪算法示例(附完整C代码)

近期比较忙, 抽空出来5.1开源献礼. 但凡学习音频降噪算法的朋友,肯定看过一个算法. <<语音增强-理论与实践>> 中提及到基于对数的最小均方误差的降噪算法,也就是LogMMSE. 资料见: <<Speech enhancement using a minimum  mean-square error log-spectral amplitude estimator.>> -----Ephraim, Y. and Malah, D. (1985) 之前也是

简单聊下Unicode和UTF-8

今晚听同事分享提到这个,简单总结下. ## Unicode字符集 Unicode的出现是因为ASCII等其他编码码不够用了,比如ASCII是英语为母语的人发明的,只要一个字节8位就能够表示26个英文字母了,但是当跨区域进行信息交流的时候,尤其是Internet的出现,除了“A”,“B”,“C",还有“你”,“我”,“他”需要表示,一个字节8位显然不够用,够因此Unicode就被发明出来,Unicode的最大码位0x10FFFF,有21位.中文对应的Unicode编码见http://www.chi

jQuery实现简单的下拉可输入组合框

[写在前面的话]网站上很多用各种插件,比如依赖bootstrap的bootstrap-select插件等.虽然这些框架可以实现很多功能,但因为在实际项目中,可能只会用到其中的某个功能,若是一概引入,会导致整个js加载过于笨重.比如前面提到的bootstrap-select插件,在不压缩的情况下,达到300多k.因此,为了实现一个可填写的下拉框有点得不偿失. 基于这种原因,于是私下用jquery写了一个比较简单的下拉可填写组合框. CSS code: 1 .container{ 2 margin:

[C#] 只是想简单说下特性

只是想简单说下特性 [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5911289.html 目录 说说特性 一.特性简介 特性提供功能强大的方法,用以将元数据或声明信息与代码(程序集.类型.方法.属性等)相关联.特性与程序实体关联后,即可在运行时使用名为“反射”的技术查询特性. 特性具有以下属性: (1)特性可向程序中添加元数据.元数据是有关在程序中定义的类型的信息.所有的 .NET 程序集都包含指定的一组元数据,这些元数据描述在程序集中定义的

Example017简单的下拉框

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>简单的下拉框</title> <style> * { padding: 0; margin: 0; } .main { width: 1200px; height: 300px; margin: 0 auto; } h3 { margin-lef

Javascript实现简单的下拉二级菜单

在线演示;http://jsfiddle.net/Web_Code/ThhbG/embedded/result/ <span style="font-size:14px;"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <

jsp简单练习-简单的下拉表单

<%@ page contentType="text/html; charset=gb2312" %> <html> <body> <form name="form1" action="SwitchApp.jsp" method="post"> 请选择一种颜色: <select name="ys"> <option value="r