C++ spimi算法误解

C++ spimi算法误解,c++,algorithm,dictionary,indexing,information-retrieval,C++,Algorithm,Dictionary,Indexing,Information Retrieval,我正试图用C语言实现一个单通道内存索引器++ 但是,在算法中,我认为有什么错误或者(很可能)我有误解 SPIMI-INVERT(token_stream) output_file = NEWFILE() dictionary = NEWHASH() while (free memory available) token ← next(token_stream) if term(token) ∈ dictionary then posting

我正试图用C语言实现一个单通道内存索引器++

但是,在算法中,我认为有什么错误或者(很可能)我有误解

SPIMI-INVERT(token_stream)
  output_file = NEWFILE() 
  dictionary = NEWHASH() 

  while (free memory available) 
     token ← next(token_stream)
     if term(token) ∈ dictionary
        then postings_list = ADDTODICTIONARY(dictionary, term(token)) 
        else postings_list=GETPOSTINGSLIST(dictionary,term(token))
     if full(postings_list)
        then postings_list = DOUBLEPOSTINGSLIST(dictionary, term(token))

     ADDTOPOSTINGSLIST(postings_list, docID(token)) 
  sorted_terms ← SORTTERMS(dictionary)  
  WRITEBLOCKTODISK(sorted_terms,dictionary,output_file) 
  return output_file
让我们假设我做了所有的分析,并将所有文档转换成一个标记流,其中标记是
术语,doc\u id

表示为每个块调用SPIMI-INVERT函数

好吧,那我们开始吧

  • 我们逐块读取流,所以现在我有一个块和 将其作为参数通过SPIMI-INVERT函数发送
  • 该函数对字典的标记进行一些处理
不知怎么的(可能是因为字典太大),我们没有免费的 当我们在while循环中时,内存不再存在

  • 该算法中断循环并将当前字典写入 磁盘
但从外部世界(作为函数的调用者)来看,我不知道 作为参数发送的块是否已完全处理。不是吗 你觉得这里有什么不对劲吗


因为到目前为止还没有答案,在和我的教授交谈之后,我正在回答我的问题

我必须说算法不是很清楚,因为我的教授也不确定。我回答这个问题就像我如何解释它一样

令牌流是一个包含令牌(术语、文档id对)的文件


我用C++实现的,可能是有用的< /p> ,因为到目前为止还没有答案,和我的教授交谈后,我回答了我的问题。 我必须说算法不是很清楚,因为我的教授也不确定。我回答这个问题就像我如何解释它一样

令牌流是一个包含令牌(术语、文档id对)的文件


我用C++实现,可能是有用的< /p>你已经错误地转录了算法;code>ADDTOPOSTINGSLIST()应该在循环内部,而不是外部。如果我理解正确,您将重复调用此过程,直到整个令牌流被消耗,每次调用都会在磁盘上生成一个文件。然后将这些文件合并在一起(基本上是一次mergesort算法)。是的,你是对的,我更正了它。是的,我会为每个街区调用这个程序。我们将拥有与块相同数量的文件。并将它们合并。到目前为止一切正常。但我想问的是,如果while循环中没有任何内存,会发生什么?或者为什么他们在那里设置了一个条件“空闲内存可用”,而不是仅仅为真?你不能称之为“每一个块”;你调用它来生成一个块,它的大小取决于你在内存中有多少空间。我不确定这是否真的适合现代操作系统,因为“可用的可用内存”并不是一个定义明确的限制-你总是可以以虚拟内存的形式获得更多,但它会随着你的移动而变得越来越慢“将每个块的字典写入磁盘,然后为下一个块启动一个新字典。”我不认为它会创建一个块。如果是这样,我认为重复调用此过程将毫无意义……(实际上,您不能这样做,因为您如何知道上一个过程的剩余位置)您知道上一个过程因已消耗的令牌流的数量而中断的位置。您错误地转录了算法;

ADDTOPOSTINGSLIST()
应该在循环内部,而不是外部。如果我理解正确,您会重复调用此过程,直到整个令牌流被消耗,每次调用都会在磁盘上生成一个文件。然后您会将这些文件合并在一起(基本上是一次mergesort算法)。是的,你是对的,我更正了。是的,我将为每个块调用此过程。我们将拥有与块相同数量的文件。并合并它们。到目前为止,一切正常。但我想问的是,如果我们在while循环中没有任何内存,会发生什么?或者为什么他们会在那里设置一个条件“可用内存可用”“而不仅仅是真的吗?你不能称之为“每一个街区”;你调用它来生成一个块,它的大小取决于你在内存中有多少空间。我不确定这是否真的适合现代操作系统,因为“可用的可用内存”并不是一个定义明确的限制-你总是可以以虚拟内存的形式获得更多,但它会随着你的移动而变得越来越慢“将每个块的字典写入磁盘,然后为下一个块启动一个新字典。”我不认为它会创建一个块。如果是这样,我认为重复调用此过程将毫无意义……(实际上,您不能这样做,因为您如何知道上一个过程的剩余位置)您知道上一个过程因已消耗的令牌流的数量而中断的位置。在写入磁盘之前,您没有对ITEN进行排序,这是一个问题,因为无法保证词典将被排序以合并块以获得最终索引。在写入磁盘之前,您没有对ITEN进行排序,这是一个问题,因为e不能保证词典将被命令为最终索引合并块。
while (there is token in token stream)
      dict = new dictionary()
      while(there is free memory available)
            token = next_token()
            dict.add_to_postingList(token)
      write_dict_to_file(dict)
      delete dict

//Assuming posting list is dynamically sized and dictionary knows if a term exist.