`
linest
  • 浏览: 155515 次
  • 性别: Icon_minigender_1
  • 来自: 内蒙古
社区版块
存档分类
最新评论

读代码-Pattern和FrequentPatternMaxHeap

 
阅读更多
package org.apache.mahout.fpm.pfpgrowth.fpgrowth;
public class Pattern implements Comparable<Pattern>

pattern封装了一组item,每个item的support值,整体的support值

  private int[] pattern;
  
  private long support = Long.MAX_VALUE;
  
  private long[] supportValues;



判断pattern是否包含。由于pattern已经是升序排列,两个数组比较推进即可。
包含有几个个条件:1.本数组长度要小外来 2.如果外来数组已经大于本数组当前值则不可能3.要么两个数组都达到末尾,要么外来数组没有到末尾
  public final boolean isSubPatternOf(Pattern frequentPattern) {
    int[] otherPattern = frequentPattern.getPattern();
    int otherLength = frequentPattern.length();
    if (this.length() > frequentPattern.length()) {
      return false;
    }
    int i = 0;
    int otherI = 0;
    while (i < length && otherI < otherLength) {
      if (otherPattern[otherI] == pattern[i]) {
        otherI++;
        i++;
      } else if (otherPattern[otherI] < pattern[i]) {
        otherI++;
      } else {
        return false;
      }
    }
    return otherI != otherLength || i == length;
  }


扩容。增大1.5倍再复制之前的。
  private void resize() {
    int size = (int) (GROWTH_RATE * length);
    if (size < DEFAULT_INITIAL_SIZE) {
      size = DEFAULT_INITIAL_SIZE;
    }
    int[] oldpattern = pattern;
    long[] oldSupport = supportValues;
    this.pattern = new int[size];
    this.supportValues = new long[size];
    System.arraycopy(oldpattern, 0, this.pattern, 0, length);
    System.arraycopy(oldSupport, 0, this.supportValues, 0, length);
  }



增加一个item,总support取所有item最小值
  public final void add(int id, long supportCount) {
    dirty = true;
    if (length >= pattern.length) {
      resize();
    }
    this.pattern[length] = id;
    this.supportValues[length++] = supportCount;
    this.support = supportCount > this.support ? this.support : supportCount;
  }




package org.apache.mahout.fpm.pfpgrowth.fpgrowth;
public final class FrequentPatternMaxHeap

在堆中保存top k个pattern

核心结构
  private final PriorityQueue<Pattern> queue;


同一support值的pattern组成一个set
  private final OpenLongObjectHashMap<Set<Pattern>> patternIndex;




判断是否可添加
如果容量未满直接可添加,如果已满,若support值大于当前最小也可以添加
  public boolean addable(long support) {
    return count < maxSize || least.support() <= support;
  }



插入新pattern,如果堆满了,存在替换过程,如果有子pattern检查还要维护同support的集合。insert函数主要进行插入前的条件筛选,主要逻辑。
  public void insert(Pattern frequentPattern) {
    if (frequentPattern.length() == 0) {
      return;
    }
    
    if (count == maxSize) {
      if (frequentPattern.compareTo(least) > 0 && addPattern(frequentPattern)) {
        Pattern evictedItem = queue.poll();
        least = queue.peek();
        if (subPatternCheck) {
          patternIndex.get(evictedItem.support()).remove(evictedItem);
        }
      }
    } else {
      if (addPattern(frequentPattern)) {
        count++;
        if (least == null) {
          least = frequentPattern;
        } else {
          if (least.compareTo(frequentPattern) < 0) {
            least = frequentPattern;
          }
        }
      }
    }
  }




具体的插入过程。检查子集,如果堆中已经有超集则不插入。
  private boolean addPattern(Pattern frequentPattern) {
    if (subPatternCheck) {
      Long index = frequentPattern.support();
      if (patternIndex.containsKey(index)) {
        Set<Pattern> indexSet = patternIndex.get(index);
        boolean replace = false;
        Pattern replacablePattern = null;
        for (Pattern p : indexSet) {
          if (frequentPattern.isSubPatternOf(p)) {
            return false;
          } else if (p.isSubPatternOf(frequentPattern)) {
            replace = true;
            replacablePattern = p;
            break;
          }
        }
        if (replace) {
          indexSet.remove(replacablePattern);
          if (!indexSet.contains(frequentPattern) && queue.add(frequentPattern)) {
            indexSet.add(frequentPattern);
          }
          return false;
        }
        queue.add(frequentPattern);
        indexSet.add(frequentPattern);
      } else {
        queue.add(frequentPattern);
        Set<Pattern> patternList;
        if (!patternIndex.containsKey(index)) {
          patternList = new HashSet<Pattern>();
          patternIndex.put(index, patternList);
        }
        patternList = patternIndex.get(index);
        patternList.add(frequentPattern);
      }
    } else {
      queue.add(frequentPattern);
    }
    return true;
  }
分享到:
评论

相关推荐

    servlet url-pattern

    通过分析和运行这些代码,我们可以更深入地理解Servlet URL-Pattern的工作原理及其在实际开发中的运用。 总的来说,Servlet URL-Pattern是Web开发中不可或缺的一部分,它帮助我们组织和管理Web应用的路由,确保请求...

    url-pattern的3种写法

    ### URL-Pattern的三种写法...每种写法都有其独特的用途和优势,在实际项目开发过程中,根据具体需求选择合适的写法可以大大提高开发效率并优化系统结构。理解这些基本概念对于成为一名合格的Web开发者来说至关重要。

    前端开源库-stylelint-selector-bem-pattern

    在前端开发中,保持CSS代码的可维护性和一致性是至关重要的。"stylelint-selector-bem-pattern" 是一个非常实用的开源库,它专为实现这一目标而设计。这个库是一个基于Stylelint的插件,利用了PostCSS的BEM(Block ...

    前端开源库-url-pattern

    总结来说,**url-pattern**是前端开发中的一个强大工具,尤其在处理URL相关任务时,能够提供更简单、更直观的解决方案,提升代码的可读性和维护性。如果你经常需要操作URL,这个开源库绝对值得你添加到你的开发工具...

    URL-pattern解析

    在Servlet技术中,`web.xml`部署描述符是配置Servlet及其相关过滤器和监听器的重要方式。`url-pattern`是`web.xml`中一个关键元素...理解并熟练掌握`url-pattern`的使用,对于开发和维护基于Servlet的Web应用至关重要。

    前端开源库-route-pattern

    从压缩包`route-pattern-master`中,你可以查看源代码,了解其实现细节。这有助于理解其内部工作原理,甚至对其进行扩展或定制以满足特殊需求。 总的来说,`route-pattern`为前端开发者提供了一种高效、灵活的路由...

    Android代码-PatternLock

    PatternLock A Material Design Pattern Lock library with auth flow implementation. Why PatterLock? Battle-tested framework implementation with necessary modifications. Supports XML attributes for ...

    设计模式整理代码-pattern.zip

    这里我们关注的是一个名为"pattern.zip"的压缩包文件,它包含了23种经典的设计模式,这些模式在实践中被广泛使用,提高了代码的可读性、可维护性和可扩展性。这篇文章将详细探讨这些设计模式及其应用。 首先,23种...

    Laravel开发-laravel-pattern-generator

    `laravel-pattern-generator`则是为了进一步提升Laravel开发效率而创建的,它能够帮助开发者快速生成如Repository、Service、Middleware、Factory等模式的代码,减少手动编写的时间和错误。 1. Repository模式:在...

    Android代码-hello-design-pattern

    hello-design-pattern Hello world using all 23 kinds of GoF design patterns. public class Main { public static void main(String[] args) throws InstantiationException, IllegalAccessException { //...

    design-pattern-java.pdf

    Factory Method Pattern 工厂三兄弟之工厂方法模式(一) 工厂三兄弟之工厂方法模式(二) 工厂三兄弟之工厂方法模式(三) 工厂三兄弟之工厂方法模式(四) 抽象工厂模式-Abstract Factory Pattern 工厂三兄弟之...

    JAVA正则表达式--Pattern和Matcher

    基于题目给出的示例代码,我们可以进一步理解 `Pattern` 和 `Matcher` 的使用方式: ```java import java.util.regex.*; public class Replacement { public static void main(String[] args) throws Exception { ...

    servlet的url-pattern匹配规则详细描述(小结)

    Servlet的URL-Pattern匹配规则是Web应用程序中Servlet和Filter配置的核心部分,它决定了Servlet或Filter如何响应特定的HTTP请求。以下是对这些匹配规则的详细解释: 1. **精确匹配** - 在`&lt;url-pattern&gt;`中指定的...

    JavaWeb Servlet中url-pattern的使用

    在实际开发中,正确配置和理解`url-pattern`可以帮助我们有效地组织和路由请求,实现更灵活的过滤和处理逻辑。如果你在配置或使用`url-pattern`时遇到问题,可以查阅更多文档,或者在相关论坛上提问,与其他开发者...

    MATLAB-array-antenna-pattern.zip_旁瓣_旁瓣 对消_自适应天线_自适应阵列_阵列天线

    阵列天线自适应旁瓣对消相关技术的研究 通过matlab实现

    前端开源库-path-to-glob-pattern

    总之,`path-to-glob-pattern` 是一个实用的前端库,它使得开发者能够更方便地处理文件路径的匹配,提高了代码的可读性和可维护性。了解并掌握这类工具的使用,对于提升前端开发效率具有重要意义。

    harmonic-pattern-scanner_harmonicpattern_mq4_

    3. "MQL4" 文件夹很可能包含了与MT4编程相关的源代码,其中可能包含了harmonic-pattern-scanner的源代码,用户可以查看和修改源代码以适应自己的交易策略。 4. "templates" 文件夹可能包含了预设的图表模板,这些...

    Refactoring-to-pattern

    - **创建型模式**:例如工厂方法(Factory Method)、建造者模式(Builder Pattern)等,用于简化对象创建过程,提高代码的灵活性和可扩展性。 - **简化型模式**:如策略模式(Strategy Pattern),用于封装算法...

    pattern8-pattern35b

    在提供的压缩包子文件名列表中,我们看到了"pattern8-pattern-35b.png",这是一个PNG格式的图像文件。PNG是一种常见的位图图像格式,它支持透明度和高质量的无损压缩,因此非常适合用于设计工作。"pattern8-pattern-...

Global site tag (gtag.js) - Google Analytics