前言
实测通义灵码:解锁智能编程的钥匙:https://developer.aliyun.com/article/1367211?spm=a2c6h.13148508.setting.15.5f074f0etrEHdr
探索通义灵码在算法生成中的无限潜力——数组篇:https://developer.aliyun.com/article/1367500?spm=a2c6h.13148508.setting.14.5f074f0etrEHdr
探索通义灵码在算法生成中的无限潜力——字符串篇:https://developer.aliyun.com/article/1368451?spm=a2c6h.13148508.setting.14.5a814f0eodKUMp
探索通义灵码在算法生成中的无限潜力——链表篇:https://developer.aliyun.com/article/1369561?spm=a2c6h.13148508.setting.14.34764f0e7tpJSK
树
树是一种抽象数据类型(ADT)或是实现这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>0) 有限节点组成一个具有层次关系的集合。
把它叫做「树」是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。
它具有以下的特点:
每个节点都只有有限个子节点或无子节点;
没有父节点的节点称为根节点;
每一个非根节点有且只有一个父节点;
除了根节点外,每个子节点可以分为多个不相交的子树;
树里面没有环路。
树比链表稍微复杂,因为链表是线性数据结构,而树不是。 树的问题可以由 广度优先搜索 或 深度优先搜索 解决。
二叉树
二叉树的最大深度
给出提问如下:
给定一个二叉树 root ,返回其最大深度。
二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。请结合以下代码完成:
class Solution:
def maxDepth(self, root: TreeNode) -> int:
生成代码如下:
验证代码正确性,完美通过!
验证二叉搜索树
给出提问如下:
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
节点的左子树只包含 小于 当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
请结合以下代码完成:
class Solution:
def isValidBST(self, root: Optional[TreeNode]) -> bool:
生成代码如下:
验证代码正确性,完美通过!
对称二叉树
给出提问如下:
给你一个二叉树的根节点 root , 检查它是否轴对称。请结合以下代码完成:
class Solution:
def isSymmetric(self, root: Optional[TreeNode]) -> bool:
生成代码如下:
验证代码正确性,完美通过!
二叉树的层序遍历
给出提问如下:
给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。请结合以下代码完成:class Solution:
def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
生成代码如下:
验证代码正确性,完美通过!
将有序数组转换为二叉搜索树
给出提问如下:
给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。
请结合以下代码完成:class Solution:
def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:
生成代码如下:
验证代码正确性,完美通过!
N叉树
N 叉树的最大深度
给出提问如下:
给定一个 N 叉树,找到其最大深度。
最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。请结合以下代码完成:class Solution:
def maxDepth(self, root: 'Node') -> int:
生成代码如下:
但是不幸的是,这次并未成功通过,并且多次测试均存在语法错误。
唯一一次不存在语法错误的情况下,跟正确答案也有差距。
但是,经过排查,我意识到了通义灵码代码的逻辑似乎并没有问题,是由于力扣的测试用例的输入格式与通义灵码的理解不一致导致的。
所以此时,我给它进行了解释。
但是离谱的是,这一次依然是错的。
折腾了半个小时,终于给训练出来了,必须指明它的代码输出是错误的,并给出正确的值,以此来让通义灵码进一步修正代码。
验证代码正确性,完美通过!
N 叉树的层序遍历
给出提问如下:
给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。请结合以下代码完成:class Node:
def init(self, val=None, children=None):
self.val = val
self.children = children
class Solution:
def levelOrder(self, root):
生成代码如下:
验证代码正确性,完美通过!
N 叉树的前序遍历
给出提问如下:
给定一个 n 叉树的根节点 root ,返回 其节点值的 前序遍历 。请结合以下代码完成:class Node:
def init(self, val=None, children=None):
self.val = val
self.children = children
class Solution:
def preorder(self, root: 'Node') -> List[int]:
生成代码如下:
验证代码正确性,完美通过!
结论
通义灵码对于基础树算法的处理也可以说是游刃有余了,今天的测试并没有碰到太多问题,唯一想总结的就是两个点:
在通义灵码初次生成代码时给入过多的提示可能会导致它的过度解读,并且如果此时生成的代码存在语法错误或者逻辑错误,再通过后期引导的方式很难让其自己完成代码修正(如果能也会耗费较长时间)。这种情况下的策略是尽量确保首次输入的是关键信息,比如我常常使用的实现目标+头部代码串的方式,当其第初次生成的代码能保证正常运行后,如有问题再慢慢进行引导调优。
引导优化的策略也很重要,就今天测试而言,在N 叉树的最大深度这一题里就用到了一个方法。首先第一是得确保通义灵码和我们处于同频,即它编写代码使用的输入输出和我们力扣中测试的输入输出是一致的(只是以此为例,实际上这也算是大模型的普遍引导方式)。当确认同频之后,如果它仍然存在错误,就需要开始逐步引导,给出适当的输入来强制它说出输出。
如果代码错误,但通义灵码说出的输出却是正确的,此时就是出现了代码逻辑幻觉。我使用的策略是会告知通义灵码“按照上述代码逻辑,当输入为XXX时,你的输出是XXX,这个是错误的,正确输出应该是XXX,请你修正代码”
如果代码错误,且通义灵码说出的输出也错误,这时我采取的第一个策略会是清除记忆之后重新生成(利用随机性),其实也有点碰运气的意思;第二种就是会告知通义灵码“你说的输出不对,正确的输出应该是XXX,请你根据正确输出修正你的代码逻辑”
当然了,大模型都具有随机性,我给出的prompt也不一定每次能100%成功,在这里也只是起到一个抛砖引玉的效果,也期望各位大佬看到之后能够一起多多交流~