数据结构与算法(二)(Python版)

2023-11-10

数据结构与算法(一)(Python版)

文章目录

递归动规

递归是一种解决问题的方法,其精髓在于将问题分解为规模更小的相同问题,持续分解,直到问题规模小到可以用非常简单直接的方式来解决。递归的问题分解方式非常独特,其算法方面的明显特征就是:在算法流程中调用自身。

初识递归:数列求和

问题: 给定一个列表,返回所有数的和。列表中数的个数不定,需要一个循环和一个累加变量来迭代求和。

循环:

def listnum(numlist):
    thesum = 0
    for i in numlist:
        thesum = thesum + i
    return thesum
print(listnum([1,2,3,4,5]))

递归:
请添加图片描述

在这里插入图片描述
数列的和=“首个数”+“余下数列”的和

def digui(numlist):
    if len(numlist) == 1:
        return numlist[0]
    else:
        return  numlist[0] + digui(numlist[1:])
print(digui([1,2,3,4,5]))

递归三定律

在这里插入图片描述

递归的应用:任意进制转换

在这里插入图片描述

def jinzhi(n,base):
    convertstring = "0123456789ABCDEF"   ## 查表
    if n < base:
        return convertstring[n]
    else:
        return  jinzhi(n//base,base) + convertstring[n%base]
print(jinzhi(14,2))

递归的应用:斐波那契数列

def feibo(n):
    if n == 1 or n ==2:
        return 1
    else:
        return feibo(n-1) + feibo(n-2)
    return feibo[n]
print(feibo(3))





递归调用的实现

在这里插入图片描述
在调试递归算法程序的时候经常会碰到这样的错误:RecursionError,是因为递归的层数太多,系统调用栈容量有限。这时候要检查程序中是否忘记设置基本结束条件,导致无限递归,或者向基本结束条件演进太慢,导致递归层数太多,调用栈溢出。

Python内置的sys模块可以获取和调整最大递归深度。

在这里插入图片描述

分治策略与递归

在这里插入图片描述

优化问题和贪心策略

在这里插入图片描述

找零兑换问题

在这里插入图片描述

贪心算法和动态规划的区别

  1. 贪心算法每一步的最优解一定包含上一步的最优解,上一步之前的最优解则不作保留;动态规划全局最优解中不一定包含前一个局部最优解,因此需要记录之前的所有的局部最优解。
  2. 贪心不能保证最后解是最佳的,一般复杂度低;而动态规划本质是穷举法,可以保证结果是最佳的,复杂度高。

贪心策略解决找零兑换问题

在这里插入图片描述
因为我们每次都试图解决问题的尽量大的一部分对应到兑换硬币问题,就是每次以最多数量的最大面值硬币来迅速减少找零面值。

找零兑换问题的递归解法

在这里插入图片描述

def recMc(coinvaluelist,change):
    mincoins = change
    if change in coinvaluelist:
        return 1           ##最小规模:直接返回
    else:
         for i in [c for c in coinvaluelist if c <= change]:
             numcoins = 1 + recMc(coinvaluelist,change - i) ##减小规模:每次减去一种硬币面值,挑选最小数量
             if numcoins < mincoins:
                 mincoins = numcoins
    return  mincoins
print(recMc([1,5,10,25],63))

递归解法虽然能解决问题,但其最大的问题是:极其低效。

在这里插入图片描述
对这个递归解法进行改进的关键就在于消除重复计算。
我们可以用一个表将计算过的中间结果保存起来,在计算之前查表看看是否已经计算过,这个算法的中间结果就是部分找零的最优解,在递归调用过程中已经得到的最优解被记录下来。在递归调用之前,先查找表中是否已有部分找零的最优解,如果有,直接返回最优解而不进行递归调用。如果没有,才进行递归调用。

在这里插入图片描述
改进后的解法,极大减少了递归调用次数对63分兑换硬币问题,仅仅需要221次递归调用是改进前的三十万分之一,瞬间返回。

找零兑换问题的动态规划解法

中间结果记录可以很好解决找零兑换问题实际上,这种方法还不能称为动态规划,而是叫做“memoization(记忆化/函数值缓存)”的技术提高了递归解法的性能。

动态规划算法采用了一种更有条理的方式来得到问题的解,找零兑换的动态规划算法从最简单的“1分钱找零”的最优解开始,逐步递加上去,直到我们需要的找零钱数。在找零递加的过程中,设法保持每一分钱的递加都是最优解,一直加到求解找零钱数,自然得到最优解。

递加的过程能保持最优解的关键是,其依赖于更少钱数最优解的简单计算,而更少钱数的最优解已经得到了。
问题的最优解包含了更小规模子问题的最优解,这是一个最优化问题能够用动态规划策略解决的必要条件。

在这里插入图片描述
在这里插入图片描述

排序与查找

顺序查找算法及分析

如果数据项保存在如列表这样的集合中,我们会称这些数据项具有线性或者顺序关系。在Python List中,这些数据项的存储位置称为下标【index】,这些下标都是有序的整数。通过下标,我们就可以按照顺序来访问和查找数据项,这种技术称为“顺序查找"。

要确定列表中是否存在需要查找的数据项,首先从列表的第1个数据项开始,按照下标增长的顺序,逐个比对数据项,如果到最后一个都未发现要查找的项,那么查找失败。

顺序查找:无序表查找

def sequentialsearch(alist,num):
    pos = 0
    found = False       ##注意found初始值为False
    while pos < len(alist) and not found:
        if alist[pos] == num:
            found =  True
        else:
            pos += 1
    return found

testlist = [11,22,33,44,55]
print(sequentialsearch(testlist,33))

时间复杂度为O(n)

顺序查找:有序表查找

当数据项存在时,比对过程与无序表完全相同。
不同之处在于,如果数据项不存在,比对可以提前结束。

在这里插入图片描述

def ordsequentialsearch(alist,num):
    pos = 0
    found = False
    stop = False
    while pos < len(alist) and not found and not stop:
        if alist[pos] == num:
            found = True
        else:
            if alist[pos] > num:
                stop = True
            else:
                pos += 1
    return found

testlist = [1,2,3,4,6]
print(ordsequentialsearch(testlist,5))

实际上,就算法复杂度而言,仍然是O(n)。只是在数据项不存在的时候,有序表的查找能节省一些比对次数,但并不改变其数量级。

二分查找算法及分析

在这里插入图片描述

def binarysearch(alist,num):
    first = 0
    last = len(alist) - 1
    found = False
    while first <= last and not found:
        mid = (last + first) // 2
        if num == alist[mid]:
            found = True
        else:
            if num > alist[mid]:
                first = mid + 1
            else:
                last = mid - 1
    return found

alist = [1,2,3,13,45,67]
print(binarysearch(alist,4))
print(binarysearch(alist,13))

二分查找算法实际上体现了解决问题的典型策略:分而治之,将问题分为若干更小规模的部分,通过解决每一个小规模部分问题,并将结果汇总得到原问题的解。

递归算法实现二分查找

def binarysearch(alist,num):
    if len(alist) == 0:
        return False           #递归结束条件
    else:
        mid = len(alist) // 2
        if alist[mid] == num:
            return True
        else:
            if alist[mid] < num:
                return binarysearch(alist[mid+1:],num)
            else:
                return  binarysearch(alist[:mid-1],num)

alist = [1,2,3,13,45,67]
print(binarysearch(alist,4))
print(binarysearch(alist,13))

在这里插入图片描述
所以二分法查找的算法复杂度是O(log n),实际代码中切片操作O(k)会使算法时间复杂度增加。

二分查找与顺序查找的对比

另外,虽然二分查找在时间复杂度上优于顺序查找,但也要考虑到对数据项进行排序的开销。如果一次排序后可以进行多次查找,那么排序的开销就可以摊薄。但如果数据集经常变动,查找次数相对较少,那么可能还是直接用无序表加上顺序查找来得经济。所以,在算法选择的问题上,光看时间复杂度的优劣是不够的,还需要考虑到实际应用的情况。

冒泡排序算法及分析

冒泡排序的算法思路在于对无序表进行多趟比较交换,每趟包括了多次两两相邻比较,并将逆序的数据项互换位置,最终能将本趟的最大项就位。经过n-1趟比较交换,实现整表排序【相当于一趟才能保证第一个数字最大项或者最小项就位】每趟的过程类似于“气泡”在水中不断上浮到水面的经过。

第1趟比较交换,共有n-1对相邻数据进行比较。一旦经过最大项,则最大项会一路交换到达最后一项。第2趟比较交换时,最大项已经就位,需要排序的数据减少为n-1,共有n-2对相邻数据进行比较,直到第n-1趟完成后,最小项一定在列表首位,就无需再处理了。

在这里插入图片描述

def bubblesort(alist):
    for passnum in range(len(alist)-1,0,-1):  
        for i in range(passnum):
            if alist[i] > alist[i+1]:
                # temp = alist[i]
                # alist[i] = alist[i+1]
                # alist[i+1] = temp
                alist[i],alist[i+1] = alist[i+1],alist[i]
alist = [54,26,93,17,77,31,44,55,20]
bubblesort(alist)
print(alist)

无序表初始数据项的排列状况对冒泡排序没有影响。算法过程总需要n-1趟,随着趟数的增加,比对次数逐步从n-1减少到1,并包括可能发生的数据项交换。比对的时间复杂度是O(n2)

最好的情况是列表在排序前已经有序,交换次数为0。最差的情况是每次比对都要进行交换,交换次数等于比对次数,平均情况则是最差情况的一半。交换次数也是O(n2)

冒泡排序优化

通过监测每趟比对是否发生过交换,可以提前确定排序是否完成,这也是其它多数排序算法无法做到的。

def bubblesort(alist):
    exchange = True          #注意exchange值的多次改变
    passnum = len(alist) - 1
    while passnum and  exchange:
        exchange = False
        for i in range(passnum):
            if alist[i] > alist[i+1]:
                exchange = True
                alist[i],alist[i+1] = alist[i+1],alist[i]
        passnum = passnum - 1

alist = [54,26,93,17,77,31,44,55,20]
bubblesort(alist)
print(alist)

冒泡排序与其他排序算法对比

冒泡排序通常作为时间效率较差的排序算法,来作为其它算法的对比基准。其效率主要差在每个数据项在找到其最终位置之前,必须要经过多次比对和交换,其中大部分的操作是无效的。但有一点优势,就是无需任何额外的存储空间开销,适应性比较广,如链式也可以进行操作。

另外,通过监测每趟比对是否发生过交换,可以提前确定排序是否完成,这也是其它多数排序算法无法做到的。如果某趟比对没有发生任何交换,说明列表已经排好序,可以提前结束算法。

选择排序算法及分析

选择排序对冒泡排序进行了改进,保留了其基本的多趟比对思路,每趟都使当前最大项就位。但选择排序对交换进行了削减,相比起冒泡排序进行多次交换,每趟仅进行1次交换,记录最大项的所在位置,最后再跟本趟最后一项交换,选择排序的时间复杂度比冒泡排序稍优比对次数不变,还是o(n2),交换次数则减少为o(n)

在这里插入图片描述

def selectionsort(alist):
    for passnum in range(len(alist)-1,0,-1):
        positionmax = 0
        for i in range(1,passnum+1):   
        #这里因为设置最大位置初始值索引为0,所以需要从列表索引为1开始比较
            if alist[i] > alist[positionmax]:
                positionmax = i
        alist[positionmax],alist[passnum] = alist[passnum],alist[positionmax]

alist = [54,26,93,17,77,31,44,55,20]
selectionsort(alist)
print(alist)

插入排序算法及分析

时间复杂度还是o(n2),插入排序的思想类似于整理扑克牌。第1趟,子列表仅包含第1个数据项,将第2个数据项作为“新项”插入到子列表的合适位置中,这样已排序的子列表就包含了2个数据项。第2趟,再继续将第3个数据项跟前2个数据项比对,并移动比自身大的数据项,空出位置来,以便加入到子列表中,经过n-1趟比对和插入,子列表扩展到全表,排序完成。

在这里插入图片描述

def insert(alist):
    for index in range(1,len(alist)):
        currentvalue = alist[index]   #插入项
        position = index

        while position > 0 and alist[position] > currentvalue :
            alist[position] = alist[position - 1]
            position = position -1
        alist[position] = currentvalue

alist = [11,23,31,24,56]

insert(alist)
print(alist)

谢尔排序算法及分析

谢尔排序以插入排序为基础,对无序表进行“间隔”划分子列表,每个子列表都执行插入排序。随着子列表的数量越来越少,无序表的排序越来越接近有序,从而减少整体排序的比对次数。

在这里插入图片描述
最后一趟是标准的插入排序,但由于前面几趟已经将列表处理到接近有序,这一趟仅需少数几次移动即可完成。

在这里插入图片描述

归并排序算法及分析

归并排序是递归算法,思路是将数据表持续分裂为两半,对两半分别进行归并排序。
递归的基本结束条件是:数据表仅有1个数据项,自然是排好序的;缩小规模:将数据表分裂为相等的两半,规模减为原来的二分之一;调用自身:将两半分别调用自身排序,然后将分别排好序的两半进行归并,得到排好序的数据表。

在这里插入图片描述

def mergesort1(alist):
    if len(alist) > 1:    #基本结束条件
        mid = len(alist) //  2
        lefthalf = alist[:mid]
        righthalf = alist[mid:]

        mergesort1(lefthalf)    #递归调用
        mergesort1(righthalf)

        i = j = k = 0
        while i < len(lefthalf) and j < len(righthalf):    ## 拉链式交错把左右半部从小到大归并到结果列表
            if lefthalf[i] < righthalf[j]:
                alist[k] = lefthalf[i]
                i = i + 1
            else:
                alist[k] = righthalf[j]
                j = j + 1
            k = k + 1


def mergesort2(alist):
    if len(alist) > 1:    #基本结束条件
        mid = len(alist) //  2
        lefthalf = alist[:mid]
        righthalf = alist[mid:]

        mergesort2(lefthalf)    #递归调用
        mergesort2(righthalf)

        i = j = k = 0

        while i < len(lefthalf):    #归并左半部剩余项
            alist[k] = lefthalf[i]
            i = i + 1
            k = k + 1
        while j < len(righthalf):  ##归并右边半部剩余项
            alist[k] = righthalf[i]
            j = j + 1
            k = k + 1

def mergesort3(alist):
    # 递归结束条件
    if len(alist) <= 1:
        return alist
   # 分解问题,并递归调用
    mid = len(alist) // 2
    left = mergesort3(alist[:mid])
    right = mergesort3(alist[mid:])

    #合并左右半部,完成排序
    merged = []
    while left and right:
        if left[0] <= right[0]:
            merged.append(left.pop(0))
        else:
            merged.append(right.pop(0))
    merged.extend(right if right else left)
    return  merged


alist = [54,26,93,17,77,31,44,55,20]
mergesort1(alist)
print(alist)

将归并排序分为两个过程来分析:分裂和归并。

分裂的过程,借鉴二分查找中的分析结果,是对数复杂度,时间复杂度为O(log n)。归并的过程,相对于分裂的每个部分,其所有数据项都会被比较和放置一次,所以是线性复杂度,其时间复杂度是O(n)
综合考虑,每次分裂的部分都进行一次o(n)的数据项归并,总的时间复杂度为
o(nlog n)

最后,我们还是注意到两个切片操作。为了时间复杂度分析精确起见,可以通过取消切片操作,改为传递两个分裂部分的起始点和终止点,也是没问题的,只是算法可读性稍微牺牲一点点。我们注意到归并排序算法使用了额外1倍的存储空间用于归并,这个特性在对特大数据集进行排序的时候要考虑进去。

快速排序算法及分析

快速排序的思路是依据一个“中值”数据项来把数据表分为两半:小于中值的一半和大于中值的一半,然后每部分分别进行快速排序(递归)。如果希望这两半拥有相等数量的数据项,则应该找到数据表的“中位数”,但找中位数需要计算开销!要想没有开销,只能随意找一个数来充当“中值”。

快速排序的递归算法“递归三要素”如下基本结束条件:
数据表仅有1个数据项,自然是排好序的。
缩小规模:根据“中值”,将数据表分为两半,最好情况是相等规模的两半。
调用自身:将两半分别调用自身进行排序(排序基本操作在分裂过程中)。

在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构与算法(二)(Python版) 的相关文章

  • 如何访问pandas数据框中的多级索引?

    我想用相同的索引来调用这些行 这是示例数据框 arrays np array bar bar baz baz foo foo qux qux np array one two one two one two one two df pd Da
  • 在 Django 中定义视图和 url。为什么调用函数时不使用括号?

    我已经在经历 Python速成课程 目前正在进行 Django Web应用程序项目 学习日志 阶段 有些东西与我已经学到的相矛盾 views py file from django shortcuts import render def i
  • 在 Python 中使用 XPath 和 LXML

    我有一个 python 脚本 用于解析 XML 并将某些感兴趣的元素导出到 csv 文件中 我现在尝试更改脚本以允许根据条件过滤 XML 文件 等效的 XPath 查询将是 DC Events Confirmation contains T
  • 用 Python 编写一个无操作或虚拟类

    假设我有这样的代码 foo fooFactory create 由于种种原因 fooFactory create 可能无法创建实例Foo 如果可以的话我想要fooFactory create 返回一个虚拟 无操作对象 这个对象应该是完全惰性
  • Sorted(key=lambda: ...) 背后的语法[重复]

    这个问题在这里已经有答案了 我不太明白背后的语法sorted 争论 key lambda variable variable 0 Isn t lambda随意的 为什么是variable在看起来像的内容中陈述了两次dict 我认为这里的所有
  • Python:当前目录是否自动包含在路径中?

    Python 3 4 通过阅读其他一些 SO 问题 似乎如果moduleName py文件位于当前目录之外 如果要导入它 必须将其添加到路径中sys path insert 0 path to application app folder
  • 我可以使用 dask 创建 multivariate_normal 矩阵吗?

    有点相关这个帖子 https stackoverflow com questions 52337612 random multivariate normal on a dask array 我正在尝试复制multivariate norma
  • 在 Windows 上使用 IPython 笔记本时出现 500 服务器错误

    我刚刚在 Windows 7 Professional 64 位上全新安装了 IPython 笔记本 我采取的步骤是 从以下位置安装 Python 3 4 1http python org http python org gt pip in
  • urllib2.urlopen() 是否实际获取页面?

    当我使用 urllib2 urlopen 时 我在考虑它只是为了读取标题还是实际上带回整个网页 IE 是否真的通过 urlopen 调用或 read 调用获取 HTML 页面 handle urllib2 urlopen url html
  • 在谷歌C​​olab中使用cv2.imshow()

    我正在尝试通过输入视频来对视频进行对象检测 cap cv2 VideoCapture video3 mp4 在处理部分之后 我想使用实时对象检测来显示视频 while True ret image np cap read Expand di
  • python中的sys.stdin.fileno()是什么

    如果这是非常基本的或之前已经问过的 我很抱歉 我用谷歌搜索但找不到简单且令人满意的解释 我想知道什么sys stdin fileno is 我在代码中看到了它 但不明白它的作用 这是实际的代码块 fileno sys stdin filen
  • WindowsError:[错误 5] 访问被拒绝

    我一直在尝试终止一个进程 但我的所有选项都给出了 Windows 访问被拒绝错误 我通过以下方式打开进程 一个python脚本 test subprocess Popen sys executable testsc py 我想杀死那个进程
  • 使用 Doc2vec 后如何解释 Clusters 结果?

    我正在使用 doc2vec 将关注者的前 100 条推文转换为矢量表示形式 例如 v1 v100 之后 我使用向量表示来进行 K 均值聚类 model Doc2Vec documents t size 100 alpha 035 windo
  • Python模块单元测试的最佳文件结构组织?

    遗憾的是 我发现有太多方法可以在 Python 中保存单元测试 而且它们通常没有很好的文档记录 我正在寻找一种 终极 结构 它可以满足以下大部分要求 be discoverable by test frameworks including
  • Scrapy 蜘蛛无法工作

    由于到目前为止没有任何效果 我开始了一个新项目 python scrapy ctl py startproject Nu 我完全按照教程操作 创建了文件夹和一个新的蜘蛛 from scrapy contrib spiders import
  • Pandas 在特定列将数据帧拆分为两个数据帧

    I have pandas我组成的 DataFrameconcat 一行由 96 个值组成 我想将 DataFrame 从值 72 中分离出来 这样 一行的前 72 个值存储在 Dataframe1 中 接下来的 24 个值存储在 Data
  • 从 dask 数据框中的日期时间序列获取年份和星期?

    如果我有一个 Pandas 数据框和一个日期时间类型的列 我可以按如下方式获取年份 df year df date dt year 对于 dask 数据框 这是行不通的 如果我先计算 像这样 df year df date compute
  • PyQt 中的线程和信号问题

    我在 PyQt 中的线程之间进行通信时遇到一些问题 我使用信号在两个线程 发送者和监听者 之间进行通信 发送者发送消息 期望被监听者接收 但是 没有收到任何消息 谁能建议可能出了什么问题 我确信这一定很简单 但我已经环顾了几个小时但没有发现
  • 使用“pythonw”(而不是“python”)运行应用程序时找不到模块

    我尝试了这个最小的例子 from flask import Flask app Flask name app route def hello world return Hello World if name main app run deb
  • 从时间序列生成日期特征

    我有一个数据框 其中包含如下列 Date temp data holiday day 01 01 2000 10000 0 1 02 01 2000 0 1 2 03 01 2000 2000 0 3 30 01 2000 200 0 30

随机推荐

  • 设计分享

    目录 具体实现功能 设计介绍 51单片简介 设计思路 设计内容 仿真图 protues8 7 程序 KeilC51 具体实现功能 利用滑动变阻器实现对直流电机转速的控制 仿真实现 汇编语言编写 设计介绍 51单片简介 51单片是一种低功耗
  • 【SCCB接口协议简介(适用于OV系列摄像头)】

    SCCB总线简介 SCCB协议与IIC协议十分相似 不过IIC是PHILIPS的专利 所以OmnVision在IIC的基础上做了点小改动 SCCB最主要是阉割了IIC的连续读写的功能 即每读写完一个字节就主机必须发送一个NA信号 SCCB简
  • 场效应管(MOS)基础知识

    MOSFET管是常用的半导体器件 又称为开关管 场效应管 英文名称 MOSFET 简称MOS管 按元件封装工艺可分为两大类 插件类 贴片类 大部分MOSFET管的外观极其类似 常见的封装种类有T0 252 T0 251 T0 220 T0
  • 新年手打,24道进阶必备Elasticsearch 面试真题(建议收藏!)

    1 elasticsearch 了解多少 说说你们公司 es 的集群架构 索 引数据大小 分片有多少 以及一些调优手段 面试官 想了解应聘者之前公司接触的 ES 使用场景 规模 有没有做过比较大 规模的索引设计 规划 调优 解答 如实结合自
  • JavaScript修改Css样式

    在JS中操作CSS属性命名上的区别 以前css直接写死在html中 现在可以通过js脚本去动态修改一个标签的样式 CSS中写法 JS中的写法 说明 color color 一个单词的样式写法是相同 font size fontSize 驼峰
  • 将与参数无关的代码抽离templates——条款44

    Templates是节省时间和避免代码重复的一个奇方妙法 不再需要键入20个类似的classes而每一个带有15个成员函数 你只需键入一个class template 留给编译器去具现化那20个你需要的相关classes和300个函数 cl
  • 使用Java语言从零开始创建区块链

    Java区块链开发与交流群 613121183 有兴趣的也可以加下哈 提供了不少区块链资料 以后有资料可以相会共享 目前网络上关于区块链入门 科普的文章不少 本文就不再赘述区块链的基本概念了 如果对区块链不是很了解的话 可以看一下我之前收集
  • Java基础之方法部分

    Java中的方法好似c c python中的函数 方法是一种语法结构 它可以把一段代码封装成一个特定功能 减少代码重复 提高开发效率 使得代码逻辑更加清晰 更牛逼 方法格式 标志符 public static 方法返回类型 方法名 形式参数
  • RTSP 协议分析

    1 概述 RTSP Real Time Streaming Protocol 实时流传输协议 是TCP IP协议体系中的一个应用层协议 由哥伦比亚大学 网景和RealNetworks公司提交的IETF RFC标准 该协议定义了一对多应用程序
  • MySQL子查询的空值问题

    目前数据库中有三个表 EMPLOYEES表 DEPARTMENTS表 LOCATIONS表 employee id department id location id first name department name street ad
  • 简单http学习:5 excute_cgi调用

    void execute cgi int client const char path const char method const char query string char buf 1024 int cgi output 2 int
  • SpringBoot怎么实现web端上传超大文件

    上周遇到这样一个问题 客户上传高清视频 1G以上 的时候上传失败 一开始以为是session过期或者文件大小受系统限制 导致的错误 查看了系统的配置文件没有看到文件大小限制 web xml中seesiontimeout是30 我把它改成了1
  • PCL RANSAC分割多个平面(方法二)

    目录 一 概述 二 代码实现 三 结果展示 一 概述 之前的文章中已经写过RANSAC拟合分割多个平面的方法 在进行结果保存的时候是通过stringstream实现的 在C 11普及的大环境下 这种方法略显复杂 本文对其进行改进 二 代码实
  • javaWeb

    Ajax 序列化表单元素 serialize 把选择器选中的元素的name和value序列化为字符串 注意 以下情况不会被序列化 1 表单元素被禁用 2 表单元素没有name属性 3 表单元素没有选中 仅限单选按钮和复选框 4 file元素
  • WebStorm2023新版设置多个窗口,支持同时显示多个项目工程

    调整设置 Appearance Behavior gt System Settings gt Project open project in New window
  • type='file' 标签选取文件/文件夹

    一般网页上传文件大家都会用到这个标签
  • tcp port numbers reused出现原因_从TCP协议的原理来谈谈rst复位攻击

    在谈RST攻击前 必须先了解TCP 如何通过三次握手建立TCP连接 四次握手怎样把全双工的连接关闭掉 滑动窗口是怎么传输数据的 TCP的flag标志位里RST在哪些情况下出现 下面我会画一些尽量简化的图来表达清楚上述几点 之后再了解下RST
  • element-ui样式篇:修改样式不影响全局,不影响其他组件

    element ui每个控件都自带了样式 使用时候很多时候需要修改样式 但是大多数遇到的情况是修改的样式要么不起作用 要么修改了默认样式 导致其他组件用到的地方样式都改了 如何修改样式起作用且不影响其他组件 一 如何找到element样式类
  • iwebsec靶场 SQL注入漏洞通关笔记5- updatexml注入(报错型盲注)

    系列文章目录 iwebsec靶场 SQL注入漏洞通关笔记1 数字型注入 mooyuan的博客 CSDN博客 iwebsec靶场 SQL注入漏洞通关笔记2 字符型注入 宽字节注入 mooyuan的博客 CSDN博客 iwebsec靶场 SQL
  • 数据结构与算法(二)(Python版)

    数据结构与算法 一 Python版 文章目录 递归动规 初识递归 数列求和 递归三定律 递归的应用 任意进制转换 递归的应用 斐波那契数列 递归调用的实现 分治策略与递归 优化问题和贪心策略 找零兑换问题 贪心算法和动态规划的区别 贪心策略