算法初探

最近在看《算法图解》,但是里面的算法都是用python2.7编写的,我准备一边看,一边自己用python3重写一遍。一方面为了加深印象,另一方面也为了以后复习查找更加的方便。

里面各种算法的用途或者工作原理就不写了,直接上代码部分。

————————持续更新中————————

1.二分查找

def binary_search(list,item):
    low=0
    high=len(list)-1

    while low<=high:
        mid=(low+high)//2
        guess=list[mid]

        if guess==item:
            return mid
        if guess>item:
            high=mid-1
        else:
            low=mid+1
    return None

my_list=[1,2,3,4,5,6,7,8,9,10]
print(binary_search(my_list,4))

2.选择排序(讲数组元素按从小到大排列)

def findSmallest(arr):
    smallest=arr[0]
    smallest_index=0
    for i in range(1,len(arr)):
        if arr[i]<smallest:
            smallest=arr[i]
            smallest_index=i
    return smallest_index

def selectionSort(arr):
    newArr=[]
    for i in range(len(arr)):
        smallest=findSmallest(arr)
        newArr.append(arr.pop(smallest))
    return newArr

my_list=[12,45,5152,131,1313,13525,131313]
print(selectionSort(my_list))

3.递归

用递归写一个简单的阶乘函数

def fact(x):
    if x==1:
        return 1
    else:
        return x*fact(x-1)

print(fact(5))

4.快速排序(递归方法)

def quicksort(array):
    if len(array)<2:
        return array
    else:
        pivot=array[0]
        less=[i for i in array[1:] if i <=pivot]
        greater=[i for i in array[1:] if i>pivot]
        return quicksort(less)+[pivot]+quicksort(greater)

my_list=[12,15,0,2,9,54]
print(quicksort(my_list))

5.散列表的应用

(1)将散列表用于查找

phone_book=dict()
phone_book["Jack"]=123456
phone_book["emergency"]=110

print(phone_book["Jack"])

(2)防止重复

voted=dict()

def check_voter(name):
    if voted.get(name):
        print("Kick them out!")
    else:
        voted[name]=True
        print("let them vote!")

check_voter("tom")
check_voter("mike")
check_voter("tom")

结果:

let them vote!
let them vote!
Kick them out!

(3)将散列表用作缓存

cache=dict()

def get_page(url):
    if cache.get(url):
        return cache[url]
    else:
        data=get_data_from_server(url)
        cache[url]=data
        return data

6.广度优先搜索

from collections import deque
graph=dict()

def search(name):
    search_queue=deque()
    search_queue+=graph[name]
    searched=[]
    while search_queue:
        person=search_queue.popleft()
        if person not in searched:
            if person_is_seller(person):
                print(person+" is a mango seller!")
                return True
            else:
                search_queue+=graph[person]
                searched.append(person)
    return False

def person_is_seller(name):
    return name[-1]=='m'

graph["you"]=["alice","bob","claire"]
graph["bob"]=["anuj","peggy"]
graph["alice"]=["peggy"]
graph["claire"]=["thom","jonny"]
graph["anuj"]=[]
graph["peggy"]=[]
graph["thom"]=[]
graph["jonny"]=[]

search("you")

7.狄克斯特拉算法

计算如图所示的起点到终点的最短时间

 

graph=dict()
graph["start"]={}
graph["start"]["a"]=6
graph["start"]["b"]=2
graph["a"]={}
graph["a"]["fin"]=1
graph["b"]={}
graph["b"]["a"]=3
graph["b"]["fin"]=5
graph["fin"]={}

infinity=float("inf")
costs=dict()
costs["a"]=6
costs["b"]=2
costs["fin"]=infinity

parents=dict()
parents["a"]="start"
parents["b"]="start"
parents["fin"]=None

processed=[]

def find_lowest_cost_node(costs):
    lowest_cost=float("inf")
    lowest_cost_node=None
    for node in costs:
        cost=costs[node]
        if cost<lowest_cost and node not in processed:
            lowest_cost=cost
            lowest_cost_node=node
    return lowest_cost_node


node=find_lowest_cost_node(costs)
while node is not None:
    cost=costs[node]
    neighbors=graph[node]
    for n in neighbors.keys():
        new_cost=cost+neighbors[n]
        if costs[n]>new_cost:
            costs[n]=new_cost
            parents[n]=node
    processed.append(node)
    node=find_lowest_cost_node(costs)

print(cost)

8.贪婪算法

在下图的广播台中找出最小的集合,使其覆盖所有的州

states_needed=set(["mt","wa","or","id","nv","ut","ca","az"])

stations={}
stations["kone"]=set(["id","nv","ut"])
stations["ktwo"]=set(["wa","id","mt"])
stations["kthree"]=set(["or","nv","ca"])
stations["kfour"]=set(["nv","ut"])
stations["kfive"]=set(["ca","az"])

final_stations=set()

while states_needed:
    best_station = None
    states_covered = set()
    for station,states in stations.items():
        covered=states_needed & states
        if len(covered)>len(states_covered):
            best_station=station
            states_covered=covered

    states_needed-=states_covered
    final_stations.add(best_station)

print(final_stations)

9.接下来要看的算法

(1)树:二叉查找树(B树),红黑树,堆,伸展树

(2)反向索引

(3)并行算法

(4)SHA算法

电动汽车数据集:2025年3K+记录 真实电动汽车数据:特斯拉、宝马、日产车型,含2025年电池规格和销售数据 关于数据集 电动汽车数据集 这个合成数据集包含许多品牌和年份的电动汽车和插电式车型的记录,捕捉技术规格、性能、定价、制造来源、销售和安全相关属性。每一行代表由vehicle_ID标识的唯一车辆列表。 关键特性 覆盖范围:全球制造商和车型组合,包括纯电动汽车和插电式混合动力汽车。 范围:电池化学成分、容量、续航里程、充电标准和速度、价格、产地、自主水平、排放、安全等级、销售和保修。 时间跨度:模型跨度多年(包括传统和即将推出的)。 数据质量说明: 某些行可能缺少某些字段(空白)。 几个分类字段包含不同的、特定于供应商的值(例如,Charging_Type、Battery_Type)。 各列中的单位混合在一起;注意kWh、km、hr、USD、g/km和额定值。 列 列类型描述示例 Vehicle_ID整数每个车辆记录的唯一标识符。1 制造商分类汽车品牌或OEM。特斯拉 型号类别特定型号名称/变体。型号Y 与记录关联的年份整数模型。2024 电池_类型分类使用的电池化学/技术。磷酸铁锂 Battery_Capacity_kWh浮充电池标称容量,单位为千瓦时。75.0 Range_km整数表示充满电后的行驶里程(公里)。505 充电类型主要充电接口或功能。CCS、NACS、CHAdeMO、DCFC、V2G、V2H、V2L Charge_Time_hr浮动充电的大致时间(小时),上下文因充电方法而异。7.5 价格_USD浮动参考车辆价格(美元).85000.00 颜色类别主要外观颜色或饰面。午夜黑 制造国_制造类别车辆制造/组装的国家。美国 Autonomous_Level浮点自动化能力级别(例如0-5),可能包括子级别的小
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值