00001 #ifndef TrieNEE_HPP
00002 #define TrieNEE_HPP
00003
00004 #include "common.hpp"
00005 #include "apriori/bodon/InnerNodeSpecific.hpp"
00006 #include <vector>
00007
00008
00009
00010 namespace Bodon
00011 {
00016 template <class TRIE>
00017 class TrieNEE : public TRIE
00018 {
00019 public:
00020 std::vector<item_t> neelist;
00021 TrieNEE():TRIE(){}
00022 TrieNEE(counter_t counter): TRIE(counter){}
00023
00025 const TrieNEE<TRIE>* isIncluded(
00026 const std::vector<item_t>& an_itemset,
00027 std::vector<item_t>::const_iterator item_it ) const;
00028
00029 bool neeFind(const item_t item) const
00030 {
00031 std::vector<item_t>::const_iterator it(neelist.begin());
00032 while(it != neelist.end() && *it < item)
00033 ++it;
00034 if(it != neelist.end() && *it == item)
00035 return true;
00036 else
00037 return false;
00038 }
00039 void neePushBackSorted(const std::vector<item_t>& new_neelist)
00040 {
00041 neelist.reserve(neelist.size() + new_neelist.size());
00042 neelist.insert(neelist.end(), new_neelist.begin(),new_neelist.end());
00043
00044 }
00045 void neeAddSorted(const std::vector<item_t>& new_neelist)
00046 {
00047 neePushBackSorted(new_neelist);
00048 std::inplace_merge(
00049 neelist.begin(), neelist.end() - new_neelist.size(), neelist.end());
00050 }
00051 void neeInsertItem(const item_t new_item)
00052 {
00053 std::vector<item_t>::iterator it(neelist.begin());
00054 while(it != neelist.end() && *it < new_item)
00055 ++it;
00056 neelist.insert(it, new_item);
00057 }
00058 };
00059
00060
00069 template <class TRIE> const TrieNEE<TRIE>*
00070 TrieNEE<TRIE>::isIncluded(
00071 const std::vector<item_t>& an_itemset,
00072 std::vector<item_t>::const_iterator item_it ) const
00073 {
00074 if( item_it == an_itemset.end() )
00075 return this;
00076 else
00077 {
00078 TrieNEE<TRIE>* subtrie(static_cast<TrieNEE<TRIE>*>(
00079 TRIE::edgelist.find(*item_it)));
00080 if(subtrie)
00081 return subtrie->isIncluded( an_itemset, ++item_it );
00082 else
00083 {
00084 if(neeFind(*item_it))
00085 return isIncluded( an_itemset, ++item_it );
00086 else
00087 return NULL;
00088 }
00089 }
00090 }
00091 }
00092
00093 #endif