/**

* 频繁项集

*/

public class FrequentNode {

//包含哪些项

private String[] subjects;

//几项集

private int k;

//支持度计数

private int count = 0;

public FrequentNode(String subject,int count){

this.subjects = new String[]{subject};

this.k = 1;

this.count = count;

}

public FrequentNode(String[] subjects){

this.subjects = subjects;

this.k = subjects.length;

Arrays.sort(this.subjects);//排序,方便生成k+1

}

/**

* 生成k+1项集

* @param node

* @return

*/

public FrequentNode merge(FrequentNode node){

if(k==1){

if(this.subjects[0].compareTo(node.subjects[0])

return new FrequentNode(new String[]{subjects[0],node.subjects[0]});

}else{

return new FrequentNode(new String[]{node.subjects[0],subjects[0]});

}

}

//前k-1项相同才连接

for(int i=0;i

if(!StringUtils.equals(this.subjects[i],node.subjects[i])){

return null;

}

}

//最后一项不同才连接

if(StringUtils.equals(this.subjects[this.k-1], node.subjects[this.k-1])){

return null;

}

String[] newFre = new String[this.k+1];

System.arraycopy(this.subjects, 0, newFre, 0, this.k-1);

if(this.subjects[k-1].compareTo(node.subjects[k-1])

newFre[k-1] = subjects[k-1];

newFre[k] = node.subjects[k-1];

}else{

newFre[k-1] = node.subjects[k-1];

newFre[k] = subjects[k-1];

}

return new FrequentNode(newFre);

}

/**

* 给出自己的k-1子集

* @return

*/

public List getChildren(){

List list = new ArrayList();

if(k==2){

return list;

}

if(k==3){

list.add(new FrequentNode(new String[]{subjects[1],subjects[2]}));

}

for(int i=0;i

String[] child = new String[k-1];

System.arraycopy(subjects, 0, child, 0, i);

System.arraycopy(subjects, i+1, child, i, k-i-1);

list.add(new FrequentNode(child));

}

return list;

}

/**

* 扫描文件 如果找到 把计数+1

* @param line

* @return

*/

public void countIncrement(String[] line){

if(line.length

return ;

}

for(String subject:subjects){

boolean flag = false;

for(String str:line){

if(StringUtils.equals(str, subject)){

flag = true;

break;

}

}

if(!flag){

return;

}

}

this.count = this.count + 1;

}

public int getK() {

return k;

}

public void setK(int k) {

this.k = k;

}

public int getCount() {

return count;

}

public void setCount(int count) {

this.count = count;

}

/**

* 两个频繁模式是否相同,我只看有哪些物品。计数和大小不看

*/

@Override

public int hashCode() {

return Arrays.hashCode(subjects);

}

@Override

public boolean equals(Object obj) {

if(obj == null){

return false;

}

if(obj instanceof FrequentNode){

return Arrays.equals(this.subjects, ((FrequentNode)obj).subjects);

}

return false;

}

@Override

public String toString() {

return StringUtils.join(subjects,",")+"\t"+count;

}

}

/**

* 简单实现aprior算法

*/

public class Aprior {

//最大的项集长度

private int maxLength = 0;

//支持度阈值

private int support = 3;

//总共多少购物篮

private int totalCount = 0;

//

private String filePath = "D:\\R\\aprior.txt";

public static void main(String[] args) {

Aprior a = new Aprior();

a.startMining();

}

private void startMining(){

//step1 遍历文件产生一项集,记录下支持度,并且统计最大项集长度

List freq = getFrequent1();

//printResult(freq);

//step2开始挖

while(freq.size() > 0){

//连接

List next = contact(freq);

//printResult(next);

//剪枝

prune(next,freq);

//输出结果

printResult(next);

freq = next;

}

}

/**

* 产生1项集

* @param filePath

* @return

*/

private List getFrequent1(){

Iterator ite;

try {

ite = FileUtils.lineIterator(new File(filePath));

} catch (IOException e) {

e.printStackTrace();

return null;

}

Map map = new HashMap();

while(ite.hasNext()){

totalCount++;

String line = ite.next();

String[] subjects = line.split(",");

maxLength = Math.max(maxLength, subjects.length);

for(String subject:subjects){

Integer count = map.get(subject);

if(count == null){

map.put(subject,1);

}else{

map.put(subject, count +1);

}

}

}

List frequent1 = new ArrayList();

for(Entry entry:map.entrySet()){

if(entry.getValue() >= support){//去掉支持度不够的1项集

frequent1.add(new FrequentNode(entry.getKey(),entry.getValue()));

}

}

return frequent1;

}

/**

* 连接k-1 ,生成k项集,根据k-1剪枝.

* @param src

* @return

*/

private List contact(List src){

List next = new ArrayList();

for(int i=0;i

for(int j=i+1;j

FrequentNode newNode = src.get(i).merge(src.get(j));

if(newNode != null){

next.add(newNode);

}

}

}

return next;

}

private void prune(List next,List prev){

Iterator ite = next.iterator();

while(ite.hasNext()){

FrequentNode newNode = ite.next();

//扫描k-1看有没有,没有移除

boolean flag = false;

for(FrequentNode child:newNode.getChildren()){

if(!prev.contains(child)){

flag = true;

break;

}

}

if(flag){

ite.remove();

}

}

//扫描文件,看有没有

Iterator fileIte;

try {

fileIte = FileUtils.lineIterator(new File(filePath));

} catch (IOException e) {

e.printStackTrace();

return;

}

while(fileIte.hasNext()){

String line = fileIte.next();

String[] subjects = line.split(",");

Iterator ite1 = next.iterator();

while(ite1.hasNext()){

FrequentNode newNode = ite1.next();

newNode.countIncrement(subjects);

}

}

Iterator ite2 = next.iterator();

while(ite2.hasNext()){

FrequentNode newNode = ite2.next();

if(newNode.getCount()

ite2.remove();

}

}

}

private void printResult(List list){

for(FrequentNode node:list){

System.out.println(node.toString());

}

}

}

输入文件:

牛奶,鸡蛋,面包,薯片

鸡蛋,爆米花,薯片,啤酒

鸡蛋,面包,薯片

牛奶,鸡蛋,面包,爆米花,薯片,啤酒

牛奶,面包,啤酒

鸡蛋,面包,啤酒

牛奶,面包,薯片

牛奶,鸡蛋,面包,黄油,薯片

牛奶,鸡蛋,黄油,薯片

输出:

牛奶,薯片    5

薯片,鸡蛋    6

薯片,面包    5

牛奶,鸡蛋    4

牛奶,面包    5

面包,鸡蛋    5

啤酒,鸡蛋    3

啤酒,面包    3

牛奶,薯片,鸡蛋    4

牛奶,薯片,面包    4

薯片,面包,鸡蛋    4

牛奶,面包,鸡蛋    3

牛奶,薯片,面包,鸡蛋    3

bom展开算法 java程序实现_java实现aprior算法相关推荐

  1. 外包3年,吃透这三份Java程序员必刷的算法宝典后,已从13K涨到25K

    懂点算法,很有必要 "不学数据结构和算法,一辈子都是码畜".不管你是 Java 程序员.算法工程师.数据分析师,还是技术管理者.架构师...... 我们都有一个共同的目标,就是在技 ...

  2. java程序组成_java程序是由什么组成的

    展开全部 1.源程序文32313133353236313431303231363533e78988e69d8331333363373732件的构成 要编写Java程序,首先应该知道Java程序文件中必 ...

  3. java遍历字符串_Java后端开发算法基础面试题分享,你离大厂也许就差这份面试题

    一.算法基础 1. 重建二叉树 题目: 输入一棵二叉树前序遍历和中序遍历的结果,请重建该二叉树. 注意: 二叉树中每个节点的值都互不相同: 输入的前序遍历和中序遍历一定合法: 演示: 给定: 前序遍历 ...

  4. 第一个java程序释义_Java 学习之路(1)第一个Java程序

    Hello World程序 在编程语言的世界里,第一个编程语言估计就是输出Hello World了吧. /** * 编写第一个Java程序,输出Hello World! * @author LJS * ...

  5. java程序结构_Java 程序结构说明(学习 Java 编程语言 004)

    1. 一个简单的类 创建 FirstSample.java 文件,来编写最简单的 Java 应用程序.下面是示例代码: public class FirstSample { public static ...

  6. java程序结构_java程序结构

    java是一门面向对象的语言,在编程过程中当然离不开对象的声明,而对象又是通过类定义的,所以java中最重要的就是各式各样的类,在java中,类也是一个程序的基本单位 0x01:默认生成类 在ecli ...

  7. java程序员_Java程序员工资为什么这么高?

    众多行业中, 程序员当然属于高薪职业.无论是国内还是国外,IT行业的程序员.工程师,甚至连码农都要比其他行业的从业者的收入高很多!尤其是作为IT界的"常青树"Java,原因是什么? ...

  8. java程序员_Java和Python的区别 好程序员帮大家解读

    Java和Python的区别 好程序员今天先来解读Java编程语言的优势,人工智能和大数据火爆一时,随之而来,引起了编程语言的人气暴涨.而Java和Python作为最炙手可热的编程语言从一开始便赢得了 ...

  9. java程序初始化_Java程序初始化顺序

    今天在课上复习了Java的初始化顺序,一直有点疑惑,搞不明白,所以打算写下来,记录一下. 先说一下Java程序初始化的顺序:父类静态变量>父类静态代码块>子类静态变量>子类静态代码块 ...

最新文章

  1. 云计算数据中心规划设计方案
  2. 后端数据操作超时_数据分析在知乎商业质量保障中的初步实践
  3. 在MAC系统的eclipse里打开android sdk manager
  4. 三种banner基础形态
  5. [HDU3037]Saving Beans,插板法+lucas定理
  6. python怎样填充颜色_python – 使用颜色填充Tkinter画布对象之间的空间
  7. 新手学java 学哪方面_初学者学Java应从哪些方面学习?
  8. 零基础学习前端:学习路线、学习计划、实战项目和面试题简历分享。
  9. 浮点数 字符串 java_Java如何将浮点数转换为字符串
  10. WIN10平板 如何关闭自动更新
  11. (文末源码)差分进化(Differential Evolution,DE)
  12. 微信支付?一起观摩Safesound勒索病毒的骚操作
  13. php中in array函数_PHP函数in_array()使用详解
  14. 一个软件完整的开发流程,不会程序也能自己制作手机App
  15. Cmd命令检测电脑配置:
  16. 修行一定要在寺院里吗,出家人离开寺院修行,都属邪门外道吗?
  17. 开发工程师必备的一直网站
  18. 倍升工作效率的小策略
  19. 渗透测试工具篇——sqlmap
  20. Hadoop服务启动出现Permission denied (publickey,password)

热门文章

  1. windosw启动redis
  2. 如何用VB.NET控制Excel單元格裡的內容?
  3. python PEP8规范
  4. 基于Java实现的快速排序
  5. 解决python 提示 SyntaxError: Missing parentheses in call to 'print'
  6. JQuery 为radio赋值问题
  7. Java 设计模式之中介者模式
  8. MongoDB语法与现有关系型数据库SQL语法比较
  9. PythonSpot 中文系列教程 · 翻译完成
  10. ApacheCN 学习资源汇总 2018.12