10大基础算法 程序员你会吗?

本文介绍了十大基础算法,包括快速排序、堆排序、归并排序、二分查找、BFPRT、DFS、BFS、Dijkstra算法、动态规划和朴素贝叶斯分类。详细讲解了每个算法的步骤和适用场景,帮助程序员理解并掌握这些经典算法。
摘要由CSDN通过智能技术生成

算法一:快速排序算法

Python学习资料 https://mz.tanzhouedu.com/?s=d7632358e94455c7
Q群 784633899

快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序n个项目要Ο(nlogn)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。

事实上,快速排序通常明显比其他Ο(nlogn)算法更快,因为它的内部循环(innerloop)可以在大部分的架构上很有效率地被实现出来。

快速排序使用分治法(Divideandconquer)策略来把一个串行(list)分为两个子串行(sub-lists)。算法步骤:

1.从数列中挑出一个元素,称为“基准”(pivot),

2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。

在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。

3.递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

算法二:堆排序算法

堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

堆排序的平均时间复杂度为Ο(nlogn) 。

算法步骤:

1.创建一个堆H[0…n-1]

2.把堆首(最大值)和堆尾互换

3.把堆的尺寸缩小1,并调用shift_down(0),目的是把新的数组顶端数据调整到相应位置

4.重复步骤2,直到堆的尺寸为1

算法三:归并排序

归并排序(Mer

讲解 Dijkstra 算法的基本思想,另外还有算法实现. 当然了,这个算法当路径点上万的时候效率上降低。 我有另外的改进实现, 上万个点也是在200毫秒内完成。但是不知道怎么添加, 我只能在这里贴关键代码了 : static std::list<Node*> vecNodes; static std::list<Edge*> vecEdges; bool CDijkstras::DijkstrasFindPath(Node* psrcNode, Node* pdstNode, std::list<Node*>& vec, double& fromSrcDist) { if (psrcNode == 0 || pdstNode == 0) return false; if (psrcNode == pdstNode) { vec.push_back(pdstNode); return false; } std::list<Node*>::const_iterator it; for (it=vecNodes.begin(); it!=vecNodes.end(); it++) { (*it)->bAdded = false; (*it)->previous = 0; (*it)->distanceFromStart = MAXDOUBLE; (*it)->smallest = 0; } bool bFindDst = DijkstrasRouteInitialize(psrcNode, pdstNode); fromSrcDist = pdstNode->distanceFromStart; Node* previous = pdstNode; while (previous) { vec.push_back(previous); previous = previous->previous; } m_pDstNode = pdstNode; return bFindDst; } bool CDijkstras::DijkstrasRouteInitialize(Node* psrcNode, Node* pdstNode) { bool bFindDst = false; psrcNode->distanceFromStart = 0; Node* smallest = psrcNode; smallest->bAdded = true; std::list<Node*>::const_iterator it, ait; std::list<Node*> AdjAdjNodes ; for (it=psrcNode->connectNodes.begin(); it!=psrcNode->connectNodes.end(); it++) { if ((*it)->bAdded) continue; (*it)->smallest = psrcNode; (*it)->bAdded = true; AdjAdjNodes.push_back(*it); } while (1) { std::list<Node*> tempAdjAdjNodes; for (it=AdjAdjNodes.begin(); it!=AdjAdjNodes.end(); it++) { Node* curNode = *it; for (ait=curNode->connectNodes.begin(); ait!=curNode->connectNodes.end(); ait++) { Node* pns = *ait; double distance = Distance(pns, curNode) + pns->distanceFromStart; if (distance < curNode->distanceFromStart) { curNode->distanceFromStart = distance; curNode->previous = pns; } if (pns->bAdded == false) { tempAdjAdjNodes.push_back(pns); pns->bAdded = true; } } if (curNode == pdstNode) { bFindDst = true; } } if (bFindDst) break; if (tempAdjAdjNodes.size() == 0) break; AdjAdjNodes.clear(); AdjAdjNodes = tempAdjAdjNodes; } return bFindDst; } // Return distance between two connected nodes float CDijkstras::Distance(Node* node1, Node* node2) { std::list<Edge*>::const_iterator it; for (it=node1->connectEdges.begin(); it!=node1->connectEdges.end(); it++) { if ( (*it)->node1 == node2 || (*it)->node2 == node2 ) return (*it)->distance; } #ifdef _DEBUG __asm {int 3}; #endif return (float)ULONG_MAX; } /****************************************************************************/ /****************************************************************************/ /****************************************************************************/ //得到区域的Key// __int64 CDijkstras::GetRegionKey( float x, float z ) { long xRegion = (long)(x / m_regionWidth); long zRegion = (long)(z / m_regionHeight); __int64 key = xRegion; key <<= 32; key |= ( zRegion & 0x00000000FFFFFFFF ); return key; } //得到区域的Key// __int64 CDijkstras::GetRegionKey( long tx, long tz ) { long xRegion = tx ; long zRegion = tz ; __int64 key = xRegion; key <<= 32; key |= ( zRegion & 0x00000000FFFFFFFF ); return key; } //取得一个区域内的所有的路径点, 返回添加的路径点的个数// unsigned long CDijkstras::GetRegionWaypoint (__int64 rkey, std::vector<Node*>& vec) { unsigned long i = 0; SAME_RANGE_NODE rangeNode = mmapWaypoint.equal_range(rkey); for (CRWPIT it=rangeNode.first; it!=rangeNode.second; it++) { i++; Node* pn = it->second; vec.push_back(pn); } return i; } inline bool cmdDistanceNode (Node* pNode1, Node* pNode2) { return pNode1->cmpFromStart < pNode2->cmpFromStart; }; //添加一个路径点// Node* CDijkstras::AddNode (unsigned long id, float x, float y, float z) { Node* pNode = new Node(id, x, y, z); __int64 rkey = GetRegionKey(x, z); mmapWaypoint.insert(make_pair(rkey, pNode)); mapID2Node[id] = pNode; return pNode; } //添加一条边// Edge* CDijkstras::AddEdge (Node* node1, Node* node2, float fCost) { Edge* e = new Edge (node1, node2, fCost); return e; } //通过路径点ID得到路径点的指针// Node* CDijkstras::GetNodeByID (unsigned long nid) { std::map<unsigned long, Node*>::const_iterator it; it = mapID2Node.find(nid); if (it!=mapID2Node.end()) return it->second; return NULL; }
### 回答1: AI 可以被用来帮助程序员完成一些重复性的任务,但是它不能完全取代程序员。在未来,AI 和程序员协同工作,而不是取代人类。程序员需要具备独特的技能,包括创造性思维和解决复杂问题的能力,这些技能是AI暂时无法替代的。 ### 回答2: AI技术的发展确实让一些人担心程序员职业的前景。然而,我认为AI不完全取代程序员的工作,而是在某些方面提供协助和改进。 首先,虽然AI在处理大量数据和重复性任务方面具有优势,但程序员不仅仅是编写代码的人。他们还需要具备分析问题、设计解决方案、沟通和协作等能力,这是AI无法完全复制的。AI只能帮助程序员提高工作效率,但无法代替创造性思维和人类的感知能力。 其次,AI技术本身需要程序员的参与和指导。AI并非自主学习和自我调整,它需要程序员根据实际情况进行指导和训练。程序员的角色是提供AI算法和模型的基础,为其配置正确的参数,并监督其工作。因此,程序员仍然是AI技术发展的关键驱动者。 最后,尽管AI在某些特定领域可以替代人类工作,但程序员职业本身也在不断发展和演变。随着新技术的出现,程序员需要不断学习和适应。AI的出现可能改变程序员从事的工作内容,但可以预见的是,程序员的需求将从简单的编码转变为更复杂的系统设计和优化。因此,程序员需要继续提升自己的技能和知识,以适应变化的就业市场。 总的来说,虽然AI对程序员的工作有一定的影响,但它不完全取代程序员程序员仍然发挥着不可替代的作用,是AI技术发展的关键参与者和指导者。 ### 回答3: AI目前已经在某些领域取得了重大进展,但是否完全取代程序员的工作是一个复杂的问题。虽然AI在编程方面的发展日新月异,但目前的AI技术仍存在许多限制和挑战。 首先,AI目前主要用于解决相对简单且明确的问题,如图像识别和自然语言处理。但在复杂的编程任务中,尤其是需要创造性思维和问题解决能力的情况下,AI仍然无法与人类程序员相比。 其次,开发和维护AI系统本身需要高度技术娴熟的专业知识,这一层面的专业人才仍然必不可少。程序员需要对AI算法进行设计、优化和测试,确保这些系统的稳定性和准确性。 此外,程序员在项目开发过程中还需要与客户、团队成员和其他利益相关者进行沟通和协作。他们需要理解和满足客户的需求,提供技术解决方案,并确保项目的顺利进行。这种人际交往和沟通的能力是AI目前无法替代的。 最后,虽然AI在辅助编程方面取得了一些成果,如自动生成代码和修复错误,但仍需要人类程序员的参与。他们可以理解整个系统的复杂性,进行调试和优化,以确保系统的高效运行。 因此,虽然AI在编程领域有着巨大的潜力和应用前景,但在可预见的未来内,AI不太可能完全取代程序员的工作。程序员仍然是设计、开发和维护AI系统的重要角色,而且他们的技能和专业知识在数字时代仍然是不可或缺的。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值