数据结构与算法自学网站(快乐学习数据结构)

news/2024/5/20 1:45:40/文章来源:https://blog.csdn.net/weixin_45677333/article/details/112595337

可视化数据结构与算法

带教程的数据结构操作:
https://visualgo.net/zh
是我最喜欢的网站了,教程也很详细,想自学也可以点击Esc,离开并进入探索模式。并且随着数据图动态变化,旁边还有代码进行配套讲解。也可以自己绘制图表来演示。

旧金山大学David Galles:
https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
特别齐全,什么算法都有。并且带插入带删除带排序等所有基本操作。
附加该网站的可视化例子的html+javascript的代码:
https://www.cs.usfca.edu/~galles/visualization/source.html

可按照代码进行步骤演示:
https://algorithm-visualizer.org/backtracking/knights-tour-problem
每一步对应哪一行代码运行都可以显示出来,还可以自己改动代码。用这个网站学完再看不懂代码就离谱。

主打排序算法:
https://www.toptal.com/developers/sorting-algorithms
先点击网页上方的Problem Size,选择一个尺寸,20,30,40还是50,都行,于是你就可以看到下面整个大表中有图片显示出来了。

  • 列。代表每一个排序算法。从左到右依次为:插入、选择、冒泡、Shell、合并Merge、堆排序、快排、快排3。
    单击每个算法的链接,你可以看到这个算法的详细解释,其中包括:算法的伪代码、算法的复杂度、相关的讨论、重点、及该算法的相关参考文档。
  • 行。不同的数据样本。从上到下依次为:随机样本、几乎排好序的样本、最差的样本(反序)、有一些相同项的样本。
    这些样本在不同的算法上都会有不同的表现。
  • 单元格。每个单元格都是一个图片。用鼠标单击图片,可以动画地演示算法整个过程。其中两个小红箭头表示了正在需要“交换顺序的数据”。

贼酷炫的排序算法:
http://sorting.at/
UI帅到没话说。但功能相比就很少了。

寻路算法可视化:
http://qiao.github.io/PathFinding.js/visual/
选择寻路算法与限制条件(还可以设置障碍墙),可以看这个算法寻路的可视化步骤。

一个个人博客:
https://bost.ocks.org/mike/algorithms/
里面着重讲算法(采样,随机乱序,排序,迷宫)的意义及优劣点,逐步深入,作者讲的很细

一个显示排序过程的python脚本:
学排序算法有点麻烦,但是这个python脚本写的真好

(需要 Cairo图片库支持)

#!/usr/bin/env python
"""Some of these algorithms are all rather literally from Knuth - as aconsequence they're not very Pythonic, and not terribly readable.In some cases I've modified the algorithm to make sure that all items arepresent once and only once in the array of sortables every time wememoizePath (i.e. that the algorithm is in-place). Page numbers refer to The Art of Computer Programming vol. 3.This code is in the public domain - do whatever you like with it.
"""
import random, math, sys
from optparse import OptionParser
import cairodef intRGB(r, g, b):return (r/255.0, g/255.0, b/255.0)HIGHLIGHT=intRGB(0xff, 0x72, 0x72)class NiceCtx(cairo.Context):defaultBorderColour = intRGB(0x7d, 0x7d, 0x7d)def stroke_border(self, border):src = self.get_source()width = self.get_line_width()self.set_source_rgba(*self.defaultBorderColour)self.stroke_preserve()self.set_source(src)self.set_line_width(width - (border * 2))self.stroke()class Canvas:def __init__(self, width, height):self.width, self.height = width, heightself.surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)self.background(1, 1, 1)def ctx(self):return NiceCtx(self.surface)def background(self, r, g, b):c = self.ctx()c.set_source_rgb(r, g, b)c.rectangle(0, 0, self.width, self.height)c.fill()c.stroke()def save(self, fname):self.surface.write_to_png(fname)class Sortable:def __init__(self, i):self.i = iself.path = []def __cmp__(self, other):return cmp(self.i, other.i)def __repr__(self):return str(self.i)class TrackList:def __init__(self, itms):self.lst = [Sortable(i) for i in itms]def __getattr__(self, attr):return getattr(self.lst, attr)def memoizePath(self):for i, v in enumerate(self):v.path.append(i)class PathDrawer:def __init__(self, width, height, line, border, highlights, prefix):self.width, self.height = width, heightself.line, self.border = line, borderself.highlights, self.prefix = highlights, prefixdef _lineCoords(self, elem, l):init = 0.02 # Proportional initial length lst = []xscale = (1.0-init)/len(elem.path)yscale = 1.0/llst.append((0, yscale/2 + (yscale * elem.path[0])))lst.append((init, yscale/2 + (yscale * elem.path[0])))for i, v in enumerate(elem.path):lst.append(((xscale * i) + init, yscale/2 + (yscale * v)))lst.append((1, lst[-1][1]))return lstdef draw(self, algo):c = Canvas(self.width, self.height)# Clearer when drawn in this orderl = reversed(algo.lst)ctx = c.ctx()for elem in l:for i in self._lineCoords(elem, len(algo.lst)):ctx.line_to(self.width * i[0], self.height * i[1])ctx.set_line_cap(cairo.LINE_CAP_BUTT)ctx.set_line_join(cairo.LINE_JOIN_ROUND)if elem.i in self.highlights:ctx.set_source_rgb(*HIGHLIGHT)else:x = 1 - (float(elem.i)/len(algo.lst)*0.7)ctx.set_source_rgb(x, x, x)ctx.set_antialias(cairo.ANTIALIAS_SUBPIXEL)ctx.set_line_width(self.line)ctx.stroke_border(self.border)c.save("%s%s.png"%(self.prefix, algo.name))class Algorithm:def __init__(self, entries):self.name = self.__class__.__name__self.lst = TrackList(entries)self.lst.memoizePath()self.sort(self.lst)class Bubble(Algorithm):def sort(self, lst):bound = len(lst)-1while 1:t = 0for j in range(bound):if lst[j] > lst[j+1]:lst[j], lst[j+1] = lst[j+1], lst[j]lst.memoizePath()t = jif t == 0:breakbound = tclass ListInsertion(Algorithm):"""Broadly based on the list insertion sort on p 97.  """def sort(self, lst):for i in range(1, len(lst)):for j in range(i):if lst[i] < lst[j]:x = lst.pop(i)lst.insert(j, x)lst.memoizePath()class Shell(Algorithm):"""Shell's method, p. 84"""def sort(self, lst):t = [5, 3, 1]for h in t:for j in range(h, len(lst)):i = j - hr = lst[j]flag = 0while i > -1:if r < lst[i]:flag = 1lst[i+h], lst[i] = lst[i], lst[i+h]i -= hlst.memoizePath()else:breaklst[i+h] = rclass Selection(Algorithm):"""Selection Sort, p. 139"""def sort(self, lst):for j in range(len(lst)-1, 0, -1):m = lst.index(max(lst[:j]))  # No, this is not efficient ;)lst[m], lst[j] = lst[j], lst[m]lst.memoizePath()class Heap(Algorithm):"""Algorithm from http://en.wikipedia.org/wiki/Heapsort"""def sift(self, lst, start, count):root = startwhile (root * 2) + 1 < count:child = (root * 2) + 1if child < (count-1) and lst[child] < lst[child+1]:child += 1if lst[root] < lst[child]:lst[root], lst[child] = lst[child], lst[root]lst.memoizePath()root = childelse:returndef sort(self, lst):start = (len(lst)/2)-1end = len(lst)-1while start >= 0:self.sift(lst, start, len(lst))start -= 1while end > 0:lst[end], lst[0] = lst[0], lst[end]lst.memoizePath()self.sift(lst, 0, end)end -= 1class Quick(Algorithm):"""http://www.cs.indiana.edu/classes/a348-dger/lectures/tsort/1.0.2/QSortAlgorithm.java"""def sort(self, lst, left=0, right=None):if right is None:right = len(lst) - 1l = leftr = rightif l <= r:mid = lst[(left+right)/2]while l <= r:while l <= right and lst[l] < mid:l += 1while r > left and lst[r] > mid:r -= 1if l <= r:lst[l], lst[r] = lst[r], lst[l]lst.memoizePath()l+=1r-=1if left < r:self.sort(lst, left, r)if l < right:self.sort(lst, l, right)def main():usage = "usage: %prog [options]"parser = OptionParser(usage)parser.add_option("-a",dest="algorithm",default=False,type="choice",choices=["quick", "heap", "selection", "insertion", "bubble", "shell"],help="Draw only a named algorithm.")parser.add_option("-n",dest="numelements",default="20",type="int",help="Generate a random sorting sequence of length n")parser.add_option("-f",dest="readfile",help="Read data from file")parser.add_option("-p",dest="prefix",help="File name prefix.",default="")parser.add_option("-d",dest="dump",default=False,action="store_true",help="Dump sequence")parser.add_option("-x",dest="width",type="int",default=700,help="Image width")parser.add_option("-y",dest="height",type="int",default=300,help="Image height")parser.add_option("-l",dest="line",type="int",default=6,help="Total line width")parser.add_option("-b",dest="border",type="int",default=1,help="Border width")parser.add_option("-i",dest="highlight",type="int",default=[],action="append",help="Highlight digit N (0-based). Can be passed muiltiple times.")options, args = parser.parse_args()if args:parser.error("Script takes no arguments.")if options.readfile:txt = file(options.readfile).read().split()lst = [int(i) for i in txt]else:lst = range(options.numelements)random.shuffle(lst)if options.highlight:if max(options.highlight) > (len(lst)-1):parser.error("Highlight element > than list length.")if options.dump:for i in lst:print i,ldrawer = PathDrawer(options.width,options.height,options.line,options.border,options.highlight,options.prefix)for i in [Quick, Heap, Selection, ListInsertion, Bubble, Shell]:name = i.__name__if options.algorithm:if not options.algorithm.lower() == name.lower():continueprint >> sys.stderr, namea = i(lst)ldrawer.draw(a)if __name__ == "__main__":main()

图片示例:(选择排序)
在这里插入图片描述

  • 折线表示了各个元素的位置变化。
  • 折线的深浅表示了元素的大小。越深则越大

脚本参数:

-a 表示使用什么样的算法,取值为"quick", "heap", "selection", "insertion", "bubble", "shell"-n 表示要排序的数据个数。
-f 表示输入文件。
-p 表示文件前缀。
-d 表示输出顺序。
-x 图片宽度。
-y 图片高度。
-l 所有线的宽度。
-b 边界宽度。

使用示例:

./visualise.py -l 6 -x 700 -y 300 -n 15

正则表达式可视化:
http://www.regexper.com/
悄悄混入
https://www.debuggex.com/
偷偷混入

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_832781.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何解决网站首页老是被篡改经常反复被篡改

网站首页被篡改说明你网站程序有漏洞导致被上传了脚本后门木马 从而进行篡改内容被百度收录一些BC内容和垃圾与网站不相关的内容,建议找专业做安全的来进行网站安全服务漏洞检测与修补以及代码安全审计&#xff0c;清理网站后门和恶意代码,而且这个快照内容被劫持 会在搜索引擎…

如何将自己的网站上传至服务器并通过域名进行访问

前期准备 个人博客地址&#xff1a;http://www.zhsh666.xyz/ 我们想要让大家都能通过域名访问自己的网站&#xff0c;首先我们需要准备一个域名、以及一个服务器 域名购买可以通过腾讯云&#xff0c;阿里云&#xff0c;等&#xff0c;我用的是腾讯云服务器和腾讯云购买的域名 …

hexo教程:搜索SEO+阅读量统计+访问量统计+评论系统

hexo教程:搜索SEO阅读量统计访问量统计评论系统 更多精彩内容欢迎访问我的个人博客皮皮猪&#xff1a;http://www.zhsh666.xyz或者http://www.zh66.club期待您的光临哦&#xff01;我是皮皮猪&#xff0c;感谢各位光临&#xff0c;能为您排忧解难小站深感荣幸&#xff01;祝您生…

网站收录提交入口

> 更多精彩内容欢迎访问我的个人博客皮皮猪&#xff1a;http://www.zhsh666.xyz或者http://www.zh66.club期待您的光临哦&#xff01;我是皮皮猪&#xff0c;感谢各位光临&#xff0c;能为您排忧解难小站深感荣幸&#xff01;祝您生活愉快&#xff01; 前些天自己搭建了一个…

我来教你如何将自己的网站上传至服务器并通过域名进行访问

如何将自己的网站上传至服务器并通过域名进行访问 欢迎关注公众号小帅搜&#xff0c;获取更多内容 前期准备 我们想要让大家都能通过域名访问自己的网站&#xff0c;首先我们需要准备一个域名、以及一个服务器 域名购买可以通过腾讯云&#xff0c;阿里云&#xff0c;等&#x…

win10 iis php虚拟目录访问,win10系统iis6部署网站时配置虚拟目录的操作方法

win10系统iis6部署网站时配置虚拟目录的操作方法?很多win10用户在使用电脑的时候&#xff0c;会发现win10系统iis6部署网站时配置虚拟目录的的现象&#xff0c;根据小编的调查并不是所有的朋友都知道win10系统iis6部署网站时配置虚拟目录的的问题怎么解决&#xff0c;不会的朋…

linux查看网站蜘蛛,网站如何快速识别百度蜘蛛?

经常听到开发者问&#xff0c;百度蜘蛛是什么?最近百度蜘蛛来的太频繁服务器抓爆了!最近百度蜘蛛都不来了怎么办?还有很多站点想得到百度蜘蛛的IP段&#xff0c;想把IP加入白名单&#xff0c;但IP地址范围动态变化不固定&#xff0c;我们无法对外公布。那么如何才能识别正确的…

java 访问家里网络IP_求助!!!!Java获取网站访问者IP

展开全部//获取ip地址public String getIpAddr(HttpServletRequest request) {String ip request.getHeader("x-forwarded-for");if(ip null || ip.length() 0 || "unknown".equalsIgnoreCase(ip)) {ip request.getHeader("Proxy-Client-IP"…

安卓封装网站源码_App封装打包是什么意思?App封装打包教程

很多企业或公司只有自己的公司网站&#xff0c;或者是一些开发者只有H5游戏&#xff0c;没有原生开发的App&#xff0c;想要开发原生App的成本又太高&#xff0c;这时就需要用到App封装打包。但是很多人都不太了解App封装打包是什么意思&#xff1f;我们今天就一起来了解一下Ap…

发布动态网站需要额外安装哪些软件_专为Win10打造的一款免费开源动态壁纸软件,可与WallpaperEngine媲美!...

前几天给我给大家推荐过一款比较好用的动态壁纸软件&#xff0c;Wallpaper Engine&#xff0c;有兴趣的朋友可以看看Wallpaper Engine不过当时推荐的是解锁版Wallpaper Engine&#xff0c;正版Wallpaper Engine&#xff0c;在Steam要卖19元。毕竟是解锁版&#xff0c;在很多功能…

网站PWA升级

渐进式网络应用 ( Progressive Web Apps )&#xff0c;即我们所熟知的 PWA&#xff0c;是 Google 提出的用前沿的 Web 技术为网页提供 App 般使用体验的一系列方案。PWA 本质上是 Web App&#xff0c;借助一些新技术也具备了 Native App 的一些特性。本文将详细介绍针对现有网站…

postMessage 两网站通信

前言: 本篇文章我将带大家一起来好好认识一下postMessage,包括它的兼容性,对应的API介绍,以及常见的几个使用场景,希望可以给有同样困惑的盆友们一点启发,给需要用这个技术的同僚们一些帮助. postMessage的定义 postMessage是html5引入的API,postMessage()方法允许来自不同源…

Django电商网站项目(1)--项目立项与结构设计

电商的7种商业模式 电商即电子商务(Electronic Commerce)&#xff0c;是是以信息网络技术为手段&#xff0c;以商品交换为中心的商务活动&#xff0c;其有多种模式&#xff1a; ①B2B(Business to Business):电子交易的双方都是商家&#xff0c;使用网络技术完成商务交易&…

Django电商网站项目(2)--准备工作

准备工作 在前文中分析了用户数据表结构(如下)&#xff0c;本文描述一些准备工作相关事项。 父模板页的抽象 Django中支持模板的继承与重写&#xff0c;在实际项目中&#xff0c;重复的页面结构很多&#xff0c;因此将父模板抽象&#xff0c;并在父模板中设置一些block用于…

Django电商网站项目(4)--商品模块

前文中已设计了与商品模块有关的表如下&#xff1a; 首页活动表用于展示一些活动图片(并附带活动链接)&#xff1b; 首页轮播表用于展示一些轮播图片(具体轮播的效果在前端使用CSS完成)&#xff1b; 首页展示表用于展示首页按分类排列后的一部分具体商品&#xff0c;展示方式意…

Django电商网站项目(6)--订单模块

设计的订单相关的表如下所示&#xff1a; 由于每一个订单中的商品种类与数量都不定&#xff0c;因此单独将订单商品提出为一个表&#xff0c;为一对多的关系。 订单的提交 从购物车页面提交是通过form形式提交的&#xff0c;在checkbox元素中定义参数value并设为对应的商品i…

Django电商网站项目(7)-部署与总结

将前述4个模块完成后项目的全部功能就完成了&#xff0c;在本地已经可以实现网站的基本功能(从用户注册到订单评论)&#xff0c;但开启服务器时使用的是Django自带的测试用服务器&#xff0c;因此仍需要将其部署到真正的可用于工程的服务器上&#xff0c;即uWSGI&#xff0c;具…

flask网站项目(1)--项目立项与结构设计

项目工作流程 一、项目立项 该项目制作一个前后端分离的租房网站&#xff0c;前端以jQuery和art-template模板引擎为基础实现功能&#xff0c;后端以flask框架为基础&#xff0c;前后端之间使用json格式传递数据。 二、简单的需求分析 1、用户模块 ①用户注册&#xff0c;通过…

flask网站项目(4)--订单模块

订单模块提供了订单生成、订单查询、接单与拒单、订单评论四个功能&#xff0c;下面按照页面来划分订单模块的功能。 1、订单预定页面 该页面从房屋详情页面跳转&#xff0c;输入参数后点击发送请求&#xff0c;在后端进行条件判断后由前端直接跳转至我的订单页面&#xff0c…

flask网站项目(5)--订单支付、总结与优化

1、订单支付 订单支付与上个项目(Django电商网站)的支付类似&#xff0c;同样调用支付宝的接口&#xff0c;简单流程&#xff1a;用户点击’去支付’按钮跳转发送请求(携带订单ID)&#xff0c;后端接收请求并校验参数后调用支付宝接口返回支付链接&#xff0c;由前端控制跳转或…