?? fptree.cs
字號:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
namespace FPTree
{
/// <summary>
/// FPTree描述類
/// </summary>
public class FPTree
{
#region 屬性部分
private int _minSupCount;
/// <summary>
/// 最小支持度計數
/// </summary>
public int MinSupCount
{
get { return _minSupCount; }
set { _minSupCount = value; }
}
/// <summary>
/// 將所有的事務放到內存中
/// </summary>
private List<List<ItemInfo>> _listStrList = new List<List<ItemInfo>>();
/// <summary>
/// 所有事務集
/// </summary>
public List<List<ItemInfo>> ListStrList
{
get { return _listStrList; }
set { _listStrList = value; }
}
/// <summary>
/// 項頭表的大小
/// </summary>
public int FrequentItemCount
{
get { return _hashFrequentItemLinkTable.Count; }
}
/// <summary>
/// 樹是否只有單一路徑
/// </summary>
public bool SinglePath
{
get {
bool _isSinglePath = true;
for(int i=0;i<_hashFrequentItemLinkTable.Count;i++)
{
TreeNodeItem _treeNodeItem = GetLinkNode(i);
if (_treeNodeItem != null && _treeNodeItem.NextNode != null)
{
_isSinglePath = false;
break;
}
}
return _isSinglePath;
}
}
/// <summary>
/// 根據Key返回支持度計數
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public int GetSupCountByID(object key)
{
return Convert.ToInt32(_hashFrequentItemTable[key]);
}
/// <summary>
/// 頻繁一項集
/// </summary>
//private List<FrequentItem> _frequentItemList = new List<FrequentItem>();
private Hashtable _hashFrequentItemTable = new Hashtable();
/// <summary>
/// 獲取頻繁一項集
/// </summary>
public Hashtable HashFrequentItemTable
{
get { return _hashFrequentItemTable; }
}
/// <summary>
/// 頻繁一項集鏈表
/// </summary>
private Hashtable _hashFrequentItemLinkTable = new Hashtable();
/// <summary>
/// 頻繁一項集索引和標識的影射
/// </summary>
private Hashtable _indexToId = new Hashtable();
private Hashtable _idToIndex = new Hashtable();
/// <summary>
/// FPTree的NULL節點
/// </summary>
private TreeNodeItem _topNode = new TreeNodeItem();
/// <summary>
/// FPTree的NULL節點
/// </summary>
public TreeNodeItem TopNode
{
get { return _topNode; }
set { _topNode = value; }
}
#endregion
/// <summary>
/// 建立FPTree
/// </summary>
public void InitializeFPTree()
{
// 每個頻繁項,按頻繁項集列表(L)次序排序
//生成FPTree
//將事務數據庫壓縮到樹中
BuildFPTree(_listStrList, _hashFrequentItemLinkTable, _indexToId);
}
/// <summary>
/// 建立條件FPTree
/// </summary>
/// <param name="_listStrList"></param>
public void InitializeConditionFPTree(List<List<TreeNodeItem>> _listStrList)
{
BuildConditionFPTree(_listStrList, _hashFrequentItemLinkTable, _indexToId);
_listStrList.Clear();
}
/// <summary>
/// 建立頻繁一項集的列表
/// </summary>
/// <param name="_hashTable"></param>
/// <param name="_frequentItemList"></param>
public void BuildFrequentItemList(string _itemName,int _count)
{
//將達到最小支持度計數的頻繁項添加到集合
if (!_hashFrequentItemTable.ContainsKey(_itemName))
{
_indexToId.Add(_hashFrequentItemTable.Count, _itemName);
_idToIndex.Add(_itemName, _hashFrequentItemTable.Count);
_hashFrequentItemLinkTable.Add(_itemName,
new FrequentLinkItem(_hashFrequentItemTable.Count, null));
_hashFrequentItemTable.Add(_itemName, _count);
}
else
_hashFrequentItemTable[_itemName]= _count;
}
/// <summary>
/// 每個頻繁項,按頻繁項集列表(L)次序排序
/// 生成FPTree
/// </summary>
/// <param name="_listStrList"></param>
/// <param name="_frequentItemList"></param>
/// <param name="_conditionTreeNodeItem"></param>
/// <param name="_hashFrequentItemLinkTable"></param>
/// <param name="_indexToId"></param>
private void BuildFPTree(List<List<ItemInfo>> _listStrList, Hashtable _hashFrequentItemLinkTable, Hashtable _indexToId)
{
//冒泡排序,排列頻繁項集列表
int count = _hashFrequentItemTable.Count;
for (int bubble = 0; bubble < count; bubble++)
{
for (int lookup = bubble + 1; lookup < count; lookup++)
{
//小的計數往下排
if ((int)_hashFrequentItemTable[_indexToId[bubble]] <
(int)_hashFrequentItemTable[_indexToId[lookup]])
{
object temp = _indexToId[bubble];
_indexToId[bubble] = _indexToId[lookup];
_indexToId[lookup] = temp;
temp = _idToIndex[_indexToId[bubble]];
_idToIndex[_indexToId[bubble]] = _idToIndex[_indexToId[lookup]];
_idToIndex[_indexToId[lookup]] = temp;
}
}
}
//有刪除操作,都用遞減
for (int index = _listStrList.Count-1; index >-1; index--)
{
List<ItemInfo> _arrStrValue = _listStrList[index];
for (int i = _arrStrValue.Count - 1; i > -1; i--)
{
ItemInfo _itemInfo = _arrStrValue[i];
if (_hashFrequentItemTable.ContainsKey(_itemInfo.ItemName))
//以index排序
_itemInfo.Index = Convert.ToInt32(_idToIndex[_itemInfo.ItemName]);
else
_arrStrValue.RemoveAt(i);
}
//如果不包含,達到最小支持度計數的事務
if (_arrStrValue.Count == 0)
{
_listStrList.RemoveAt(index);
continue;
}
//冒泡排序
count = _arrStrValue.Count;
for (int bubble = 0; bubble < count; bubble++)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -