Skip to content

Instantly share code, notes, and snippets.

@tabris2012
Created December 3, 2012 07:19
Show Gist options
  • Save tabris2012/4193341 to your computer and use it in GitHub Desktop.
Save tabris2012/4193341 to your computer and use it in GitHub Desktop.
def makeIdealEdges(posterSearch, gviz, idealNodes, depth)
posterHash = @posterDistance[posterSearch].sort{|a, b| b[1].length <=> a[1].length}
lastLength = posterHash[0][1].length #始めの共有単語数
toDraw = Array.new #出力予定ポスターを回収
#まず共有単語数の一番多いポスターをすべて回収
posterHash.each do |number, words|
if words.length != lastLength #同順でなくなったら
lastLength = words.length
break
end
toDraw.push([number, words.last.to_i]) #wordsの最後に頻度合計値が入っている
lastLength = words.length #前回の単語数を記憶しておく
end
if toDraw.length > idealNodes#既に理想出力数を超えていたら
toDraw = toDraw.sort{|a, b| a[1] <=> b[1]} #単語頻度の小さい順に入れ替え
toDraw.slice(0..idealNodes).each do |number, words| #理想出力数まで出力
gviz.route "#{posterSearch[0].to_i}".to_sym => "#{number[0].to_i}".to_sym
gviz.node "#{number[0].to_i}".to_sym, label:"#{number[0]}:#{number[1]}"
if depth > 1 #まだ深くなければ
makeIdealEdges(number, gviz, depth, depth - 1)
end
end
else #届いていなければさらに追加
drawnNodes = toDraw.length #既に出力したノード数を記録
toDraw = 0 #同順位のポスター数を数える
posterHash.slice(drawnNodes..-1).each do |number, words|
if words.length != lastLength #同順位でなくなったら
if (toDraw + drawnNodes) > idealNodes #出力上限数を超えていれば
break
else #上限を超えていなければ
drawnNodes += toDraw #出力予定数を追加
toDraw =0
end
end
toDraw +=1
lastLength = words.length #前回の単語数を記憶しておく
end
#最後に全て出力
posterHash.slice(0..drawnNodes).each do |number, words|
gviz.route "#{posterSearch[0].to_i}".to_sym => "#{number[0].to_i}".to_sym
gviz.node "#{number[0].to_i}".to_sym, label:"#{number[0]}:#{number[1]}"
makeIdealEdges(number, gviz, idealNodes - drawnNodes + depth, depth - 1)
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment