https://blog.csdn.net/tuqu/article/details/4749586 https://pages.mtu.edu/~shene/COURSES/cs3621/NOTES/