深さ優先探索2
昨日のだと答えまで探せそうもないので書き換えた。結構見栄えが悪い。。
dfs.py
#!/usr/bin/env python #! -*- coding:utf-8 -*- #sqlalchemyで深さ優先探索 import model def depthFirstSearch(): session = model.startSession() q = session.query(model.Markov) node = {"text":u"A","visit":False} stack =[] stack.append(node) while len(stack) != 0: node = stack[-1] if node["text"] == u"yyend": stack[-1]["visit"] = True break else: if node["visit"] == True: stack.pop() else: print (node["text"]) stack[-1]["visit"] = True f = q.filter(model.Markov.now==node["text"]) for fq in f: stack.append({"text":fq.next,"visit":False}) print ("ans") for s in stack: if s["visit"] == True: print s depthFirstSearch()
model.py
#!/usr/bin/env python # -*- coding: utf-8 -*- # マルコフテーブル等定義 import sqlalchemy from sqlalchemy.orm import scoped_session, sessionmaker, mapper from sqlalchemy import MetaData from sqlalchemy import Column, MetaData, Table, types from datetime import datetime class Markov(object): pass metadata = sqlalchemy.MetaData() markovOneColumn = Table("markovVsearchTemp",metadata, Column('id', types.Integer, primary_key=True), Column('now', types.Unicode(32)), Column('next', types.Unicode(32)), Column('count', types.Integer,default=1), mysql_engine = 'MyISAM', mysql_charset= 'utf8' ) def startSession(): config = {"sqlalchemy.url": "データベースへのパス" } engine = sqlalchemy.engine_from_config(config) dbSession = scoped_session( sessionmaker( autoflush = True, transactional = True, bind = engine ) ) mapper(Markov,markovOneColumn) metadata.create_all(bind=engine) print ("--start DB Session--") return dbSession
実行結果
$ dfs.py --start DB Session-- A F G B E ans {'text': u'A', 'visit': True} {'text': u'B', 'visit': True} {'text': u'E', 'visit': True} {'text': u'yyend', 'visit': True}