一:数据处理常见方法:hash方法、bit-map法(位图)、bloom filter(布隆过滤器)、数据库优化法、倒排序索引法、外排序索引法、tire树、堆、双层桶排序、mapreduce。
二:hash法
hash一般称为散列,是一种映射关系。构建散列表需要设定一个散列函数,加油设定一个冲突处理方法。冲突处理主要有:开放地址法(当地址发生冲突时,按照固定函数在散列,知道找到空闲位置)链地址法(设置指针组ch【m】,所有散列地址为i的数据元素都插入到头指针为策划ch【i】的链表中)再散列法(在散列冲突使用第二个、第三个。。。直到无冲突)建立公共溢出区。
hash主要是用来进行“快速存取”,在o(1)的时间复杂里,可以查找到元素,或者判断元素是否存在。
三、bit-map法
例题:从八位号码中找出重复号码,或删除重复号码。8位数字最多可以表示99999999个号码,每存储一个号码占用一个bit位,则需要99mbit,12.75MB就可以存储。例如,00000123的号码,把第123位置为1,当位为1时输出改位当前下标,则得出改信息。
三:blooom filter法
bloom filter的基本思想是位数组和hash函数的联合使用。包涵一个m位的位数组,初始化为0,定义k个不同的hash函数,每个函数为映射到一位。置为1,查询某元素是否存在时,检测该k个位是否全部为1。特点:检测不存在一定不存在,检测存在不一定存在。有可能是其他元素的置位复合而成的。
四:倒排索引法
正向索引文档占据了中心位置,每个文档指向一个他所包含的索引项的序列。例如,文档指向了它包含的那些单词,反向索引则是单词指向了包含他的文档。倒索引的优点是在处理复杂的多关键字查询时,可以在倒排表中先完成查询的交并等逻辑。
五、外排序法
在待排数量打的时候,在内存中不能一次处理,可以以文件的形式存在外存中,排序的时候一部分一部分调入内存排序。
六、tire树(字典树 或者键树)
用于快速字符串检索的多叉树结构,利用公共前缀来减少时间的开销,以空间换时间。一般采用26叉树进行组织。例如求解兄弟单词。
import java.util.*;
public class trietree {
public trietree() {
}
class TireNode{
Vector<String> bwords=new Vector<String>();
TireNode[] next=new TireNode[26];
TireNode()
{
for(int i=0;i<26;i++)
{
next[i]=null;
}
}
};
void InsertNode(TireNode root,String word)
{
if(word.length()==0)
{
return ;
}
if(root==null)
{
root=new TireNode();
}
int i=0;
char [] sword=word.toCharArray();
Arrays.sort(sword);
TireNode next=root;
while(i<word.length())
{
if(next.next[sword[i]-'a']==null)//如果当前节点的sword【i】位置的字母不为空,则已经存在,不为空则不存在该字母,则添加
{
TireNode nnext=new TireNode();
next.next[sword[i]-'a']=nnext;
}
next=next.next[sword[i]-'a'];
i++;
}
next.bwords.add(word);//把每一个节点有的单词加进来,大大减低时间复杂度
}
boolean SearchNode(TireNode root,String word)
{
char [] sword=word.toCharArray();
Arrays.sort(sword);
int i=0;
while(i<word.length())
{
if(root.next[sword[i]-'a']!=null)
{
root=root.next[sword[i]-'a'];
i++;
}
else
{
break;
}
}
if(i==word.length())
{
for(int j=0;j<root.bwords.size();j++)
{
System.out.print(root.bwords.get(j)+" ");
}
System.out.println();
return true;
}
return false;
}
public void findbrother()
{
TireNode root=new TireNode();
InsertNode(root,"hehao");
InsertNode(root,"ehaoh");
InsertNode(root,"haohe");
InsertNode(root,"aoheh");
InsertNode(root,"et");
InsertNode(root,"eh");
InsertNode(root,"oheha");
}
public static void main(String[] args) {
// TODO code application logic here
new trietree().findbrother();
}
}
七、双层桶排序
双层桶不是一种数据结构,而是一种类似于分治思想的算法思想。元素范围很大,所以通过多次划分,逐步确定范围。桶排序的基本思想是把【0,1)划分为N个大小相同的子区间,每个区间是一个桶,然后将N个记录放入桶中,例如排序0~99的数,划分为10个区间即0~9、10~19、20~29。。。90~99,然后在每个小区间里面排序。通常由大桶组外接小桶链组成。
八、mapreduce法
核心操作是map(映射)和reduce(化简)map函数独立地对每个元素进行操作,把一组键值对映射成一组新的键值对,通过map程序将数据切割成不同的块,分配给大量计算机处理达到分布式的下过。然后通过指定并发的reduce函数将结果汇总。
九、top-k问题
在大规模数据处理中,经常会遇到的一类问题:在海量数据中找出出现频率最好的前k个数,或者从海量数据中找出最大的前k个数,这类问题通常被称为top K问题。例如,在搜索引擎中,统计搜索最热门的10个查询词;在歌曲库中统计下载最高的前10首歌等。针对top K类问题,通常比较好的方案是分治+Trie树/hash+小顶堆(就是上面提到的最小堆),即先将数据集按照Hash方法分解成多个小数据集,然后使用Trie树活着Hash统计每个小数据集中的query词频,之后用小顶堆求出每个数据集中出现频率最高的前K个数,最后在所有top K中求出最终的top K。
例如有一亿个浮点数找出其中最大的10000个。
第一种将数据全部排序,第二种局部淘汰法,建立空间为10000的数组,如果有更大的数就替换,第三种分而治法,用hash分成100份,每一份取出前10000个大数,之后合并操作再排序。第四种hash法,先去除重复数据,减少内存。第五种,采用最小堆。用mapreduce很适合。
重复问题,排序问题用bit-map位图法,把数据置位,按顺序输出存储位置,即排序之后的数据。统计不同号码的数量,bit-map直接过滤。
十、堆的实现
堆排序是一种选择排序,整体主要由构建初始堆+交换堆顶元素和末尾元素并重建堆两部分组成。其中构建初始堆经推导复杂度为O(n),在交换并重建堆的过程中,需交换n-1次,而重建堆的过程中,根据完全二叉树的性质,[log2(n-1),log2(n-2)...1]逐步递减,近似为nlogn。所以堆排序时间复杂度一般认为就是O(nlogn)级。
来源:CSDN
作者:qq_39031823
链接:https://blog.csdn.net/qq_39031823/article/details/84480992